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

时间:2011-10-10 15:22:37

标签: java jpa constructor java-ee-6

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

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

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

所以相反我会:

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

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

3 个答案:

答案 0 :(得分:5)

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

在这种情况下,我不太关心不必要的ArrayList实例化。这不是典型的JPA应用程序占用最多时间的地方。我发现拥有明确的不变量并尊重它们更为重要。其中一个不变量是:我的实体总是有一个非空的其他实体列表。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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