我正在阅读一篇文章,其中作者已经实现了这样的Entity类:
@Entity
public class Product {
@OneToMany
private List<Part> parts; // note the missing "= new ArrayList<Part>();"
public Product() {
}
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我总是习惯实例化集合字段,在这种情况下parts
,是inline(private List<Part> parts = new ArrayList<Part>();
)或在构造函数内部,因为据我记忆,不这样做会导致所有类型的NPE.
我认为JPA 2中的事情发生了变化,现在JPA运行时使用运行时字节码增强或反射自动实例化该字段,所以我再试一次,但是如果没有实例化parts
字段我仍然无法工作,否则aProduct.getParts().add(aPart)
会抛出NPE.
所以我的问题是,如果不parts
使用Hibernate作为提供程序在Java SE和Java EE环境中实例化该字段,是否可以使这项工作成为可能?如果是这样,怎么样?
我的理解是JPA提供程序只能在从DB加载的实体中正确地实例化该字段.但是,如果您创建一个新的(暂时的)实体,则必须确保所有字段都有效.请注意,在您实际将其附加到持久性上下文之前,Hibernate/JPA不知道新创建的瞬态实体.如果你考虑它,它是合乎逻辑的(至少对我来说):如果你依靠JPA/Hibernate来正确地实例化你的对象,你会建立一个强大的,侵入性的实现依赖,这将使它变得非常困难没有它再也无法工作.
因此,将集合属性保持为未初始化可能对于从未重新创建的实体来说很好,只能从DB加载.对于您也创建新实例的类,解决此问题的最简单方法是提供两个构造函数:Hibernate/JPA的默认值,以及"手动"创建的参数化构造函数.如果您没有要设置的参数,还可以创建静态工厂方法以使用默认值初始化所有必需字段.
归档时间: |
|
查看次数: |
2186 次 |
最近记录: |