Использование конструктора для инициализации свойств в JPA - PullRequest
3 голосов
/ 10 октября 2011

У меня есть сомнения по поводу использования конструктора для инициализации списков и других полей при использовании JPA, в частности, мой вопрос заключается в следующем:

Предположим, у меня есть объектный бин, который имеет множество отношений @OneToMany, я хотел бы использовать конструктор для их инициализации, чтобы мне не приходилось использовать такие выражения в моих контроллерах:

myEntity=new MyEntity();
myEntity.innerList=new ArrayList<Type>();
myEntity.innerList.add(newObject);

так что вместо этого у меня будет:

public MyEntity(){
 innerList=new ArrayList<Type>();
}

Теперь вопрос в том ... вызовет ли JPA этот конструктор при отображении свойств из базы данных? Я имею в виду, если бы я сохранил до полного списка, запустится ли конструктор и повторно инициализирует мои списки энтит? Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Да, JPA вызовет конструктор no-arg вашей сущности.После этого ваши списки будут заменены конкретными реализациями списков вашего движка JPA.Эти списки допускают ленивую загрузку и другие функциональные возможности, необходимые для движка JPA.

В этом случае я бы не заботился о ненужной ArrayList реализацииЭто не то, где типичное приложение JPA займет больше всего времени.Я считаю, что гораздо важнее иметь четкие инварианты и уважать их.Один из этих инвариантов: моя сущность всегда имеет ненулевой список других сущностей.

3 голосов
/ 10 октября 2011

Если я правильно помню, по крайней мере в Hibernate, когда вы load() экземпляр, в первую очередь вызывается конструктор без аргументов, а затем присваиваются ассоциации. Фактически, эти экземпляры, созданные в конструкторе, будут отброшены, когда JPA назначит сохраненную коллекцию / сущности.

Итак, если это то, что вы спрашиваете, то безопасно использовать эти инициализации в конструкторе.

2 голосов
/ 10 октября 2011

Да, JPA вызовет ваш конструктор без аргументов (создав пустой список ArrayList) и затем установит innerList для значений из баз данных (путем доступа к полю или вызова установщика, в зависимости от вашей конфигурации).*

...