быстрый вопрос:
У меня есть веб-приложение (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;
}
И для этой сущности мы создаем оболочку Dog
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), он всегда берет постоянный контекст из транзакции, поэтому его статичность не кажется плохой идеей.Но я боюсь, что могу что-то испортить.
Есть мысли?