gpt4 book ai didi

hibernate - JPA 中是否必须实例化集合字段?

转载 作者:行者123 更新时间:2023-12-03 06:48:16 25 4
gpt4 key购买 nike

我正在阅读一篇文章,其中作者实现了如下所示的实体类:

@Entity
public class Product {

@OneToMany
private List<Part> parts; // note the missing "= new ArrayList<Part>();"

public Product() {
}

// getters and setters

}

我总是习惯于实例化集合字段,在本例中为 parts ,无论是内联( private List<Part> parts = new ArrayList<Part>(); )还是在构造函数内,因为据我所知,不这样做会导致各种 NPE。

我认为 JPA 2 中的情况发生了变化,现在 JPA 运行时使用运行时字节码增强或反射自动实例化该字段,因此我再次尝试,但是如果不实例化 parts 字段,我仍然无法让它工作,否则 aProduct.getParts().add(aPart) 将抛出 NPE。

所以我的问题是,是否可以在不使用 Hibernate 作为提供程序的 Java SE 和 Java EE 环境中实例化 parts 字段的情况下完成这项工作?如果是这样,怎么办?

最佳答案

我的理解是,JPA 提供程序只能在从数据库加载的实体中正确实例化该字段。但是,如果您创建一个新的(暂时的)实体,则必须确保所有字段均有效。请注意,Hibernate/JPA 并不知道新创建的 transient 实体,直到您实际将其附加到持久性上下文。如果你仔细想想,这是合乎逻辑的(至少对我来说):如果你依靠 JPA/Hibernate 来正确实例化你的对象,你将建立对它的强大且侵入性的实现依赖,这将使得很难没有它就不可能再工作。

因此,对于从未重新创建、仅从数据库加载的实体来说,保留集合属性未初始化可能没问题。对于您也创建新实例的类,解决此问题的最简单方法是提供两个构造函数:一个用于 Hibernate/JPA 的默认构造函数,另一个用于“手动”创建的参数化构造函数。如果您没有要设置的参数,您还可以创建一个静态工厂方法来使用默认值初始化所有必需字段。

关于hibernate - JPA 中是否必须实例化集合字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3853518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com