Обязательно ли создавать экземпляры полей коллекции в JPA? - PullRequest
3 голосов
/ 04 октября 2010

Я читал статью, в которой автор реализовал класс Entity, подобный этому:

@Entity
public class Product {

 @OneToMany
 private List<Part> parts; // note the missing "= new ArrayList<Part>();"

 public Product() {
 }

 // getters and setters

}

Я всегда использовал для создания экземпляров полей коллекции, в данном случае parts, либо встроенный (private List<Part> parts = new ArrayList<Part>();) или внутри конструктора, потому что, насколько я помню, это не привело бы ко всем видам NPE.

Я думал, что в JPA 2 все изменилось, и теперь среда выполнения JPA автоматически создает экземпляр поля, используя байт-код среды выполненияулучшения или отражения, поэтому я дал ему еще одну попытку, однако я все еще не могу заставить его работать без создания экземпляра поля parts, в противном случае aProduct.getParts().add(aPart) вызовет NPE.

Так что мой вопрос в том, чтоМожно ли заставить это работать без создания экземпляра поля parts в средах Java SE и Java EE с использованием Hibernate в качестве поставщика?Если да, то как?

Ответы [ 2 ]

9 голосов
/ 04 октября 2010

Насколько я понимаю, провайдер JPA может только правильно создать экземпляр поля в объекте, загруженном из БД. Однако, если вы создаете новую (пока что временную) сущность, вы должны убедиться, что все поля действительны. Обратите внимание, что Hibernate / JPA не знает о недавно созданной переходной сущности, пока вы фактически не присоедините ее к контексту постоянства. И если вы подумаете об этом, то это логично (по крайней мере для меня): если вы полагаетесь на JPA / Hibernate для правильной реализации ваших объектов, вы бы создали сильную и навязчивую зависимость от реализации, что очень усложнит процесс невозможно без него когда-либо снова работать.

Таким образом, оставить свойство коллекции неинициализированным может быть хорошо для сущностей, которые никогда не создаются заново, а только загружаются из БД. Для классов, где вы тоже создаете новые экземпляры, самый простой способ решить эту проблему - предоставить два конструктора: по умолчанию для Hibernate / JPA и параметризованный для создания «вручную». Если у вас нет параметров для установки, вы также можете создать статический метод фабрики для инициализации всех обязательных полей со значениями по умолчанию.

2 голосов
/ 04 октября 2010

Если вы загружаете Entity из хранилища данных, тогда вам НЕ нужно «создавать экземпляр» поля, так как оно будет загружено из хранилища данных (если оно существовало в постоянном хранилище). Если в persist () коллекция была нулевой, то при ее извлечении она, скорее всего, также будет нулевой (поскольку в этом и заключается смысл сделать механизм сохранения постоянным прозрачным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...