класс, в отличие от стандартного сеанса, который с состоянием.
ый вопрос:
У меня есть веб-приложение (wicket + spring + jpa) и я думал о довольно необычном архитектурном дизайне. Пожалуйста, проверьте это и дайте свои комментарии.
Рассмотрим класс Wrapper:
@Service
public class Wrapper {
protected static EntityManager entityManager;
@PersistenceContext
private void injectEntityManager(EntityManager entityManager) {
Wrapper.entityManager = entityManager;
}
как вы видите, теперь EntityManager вводится статически.
Теперь рассмотрим простую сущность DogEntity
@Entity
public class DogEntity {
String name;
}
И для этой сущности мы создаем упаковщик собак
public class Dog extends Wrapper {
private DogEntity entity;
private Dog(DogEntity entity) {
this.entity = entity;
}
public static Dog create(String name) {
entity = new DogEntity();
entity.name = name;
entityManager.persist(entity); // for a moment forget that this code is not in transaction
return new Dog(entity);
}
}
Теперь в моем веб-приложении (в моем контроллере) я могу сделать что-то вроде этого:
saveButton = new Button("save") {
public void onSubmit() {
Dog dog = Dog.create(name);
// other code
}
С точки зрения кода эта архитектура выглядит идеально. У нас есть обертки, представляющие бизнес-объекты. Все они имеют постоянное состояние, в приложении нет глупых сервисов, называемых DogSaver с методом save (DogEntity), которые вызывают только персистентность в диспетчере сущностей. Код действительно получает много читабельности и имеет некоторые другие преимущества, но я не буду вдаваться в подробности.
Что меня действительно беспокоит, так это статический EntityManager. У меня недостаточно знаний о внутренностях Spring, чтобы знать, является ли этот подход правильным и безопасным. Существуют ли ситуации, когда вещи становятся ужасными? Я знаю, что EntityManare не имеет состояния (в соответствии со спецификацией JPA), он всегда берет постоянный контекст из транзакции, поэтому его статичность не кажется плохой идеей. Но я боюсь, что могу что-то испортить.
есть идеи?