Java 在JPA中使用构造函数初始化属性

Java 在JPA中使用构造函数初始化属性,java,jpa,constructor,java-ee-6,Java,Jpa,Constructor,Java Ee 6,我对使用JPA时使用构造函数初始化列表和其他字段有疑问,具体问题如下: 假设我有一个实体bean,它有许多@OneToMany关系,我想使用构造函数来初始化它们,这样我就不必在控制器中使用这样的语句: myEntity=new MyEntity(); myEntity.innerList=new ArrayList<Type>(); myEntity.innerList.add(newObject); myEntity=newmyentity(); myEntity.innerLi

我对使用JPA时使用构造函数初始化列表和其他字段有疑问,具体问题如下:

假设我有一个实体bean,它有许多@OneToMany关系,我想使用构造函数来初始化它们,这样我就不必在控制器中使用这样的语句:

myEntity=new MyEntity();
myEntity.innerList=new ArrayList<Type>();
myEntity.innerList.add(newObject);
myEntity=newmyentity();
myEntity.innerList=新的ArrayList();
myEntity.innerList.add(newObject);
因此,我会:

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

现在,问题是。。。从数据库映射属性时,JPA会调用此构造函数吗?。我的意思是,如果我在一个完整的列表之前一直存在,构造函数会运行并重新初始化我的实体列表吗?。非常感谢。

是的,JPA将调用无参数构造函数(创建一个空的ArrayList),然后将
innerList
设置为数据库中的值(通过访问字段或调用setter,具体取决于您的配置)。

如果我没记错的话,至少在Hibernate中,当您
加载一个实例时,首先调用无参数构造函数,然后分配关联。事实上,当JPA分配持久化集合/实体时,在构造函数中创建的那些实例将被丢弃


因此,如果这是您所要求的,那么在构造函数上使用这些初始化是安全的。

是的,JPA将调用您实体的无参数构造函数。之后,您的列表将被JPA引擎的特定列表实现所取代。这些列表允许延迟加载和JPA引擎所需的其他功能

在本例中,我不太关心不必要的
ArrayList
实例化。这并不是典型的JPA应用程序花费最多时间的地方。我发现拥有清晰的不变量并尊重它们更为重要。这些不变量之一是:我的实体总是有一个非空的其他实体列表