我怀疑在使用JPA时使用构造函数初始化列表和其他字段,具体我的问题如下:
假设我有一个实体bean,它有很多@OneToMany关系,我想使用构造函数初始化它们,这样我就不必在我的控制器中使用这样的语句了:
myEntity=new MyEntity();
myEntity.innerList=new ArrayList<Type>();
myEntity.innerList.add(newObject);
所以相反我会:
public MyEntity(){
innerList=new ArrayList<Type>();
}
现在,问题是......在从数据库映射属性时,JPA会调用此构造函数吗?我的意思是如果我在整个列表之前保留,构造函数是否会运行并重新初始化我的entites列表?非常感谢。
答案 0 :(得分:5)
是的,JPA将调用您实体的no-arg构造函数。之后,您的列表将被JPA引擎的特定List实现替换。这些列表允许延迟加载和JPA引擎所需的其他功能。
在这种情况下,我不太关心不必要的ArrayList
实例化。这不是典型的JPA应用程序占用最多时间的地方。我发现拥有明确的不变量并尊重它们更为重要。其中一个不变量是:我的实体总是有一个非空的其他实体列表。
答案 1 :(得分:3)
如果我没记错的话,至少在Hibernate中,当你load()
一个实例时,首先调用无参数构造函数,然后分配关联。事实上,当JPA分配持久化的集合/实体时,在构造函数中创建的那些实例将被丢弃。
因此,如果这是您要求的,那么在构造函数上使用这些初始化是安全的。
答案 2 :(得分:2)
是的,JPA会调用你的无参构造函数(创建一个空的ArrayList),然后将innerList
设置为数据库中的值(通过访问字段或调用setter,具体取决于你的配置)。