gpt4 book ai didi

java - JPA 延迟加载适用于最终实体和私有(private)构造函数

转载 作者:行者123 更新时间:2023-12-01 11:11:18 24 4
gpt4 key购买 nike

我有以下实体

@Entity
@Table(name = "VEHICLE")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public final class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "VEHICLE_ID")
private int vehicleId;

@Column(name = "MANUFACTURER")
private String manufacturer;

@ManyToOne
@JoinColumn(name = "personId")
private Person person;
//private constructor
private Vehicle() { }
//getters and setters
}

@Entity
@Table(PERSON)
public final class Person {
@Id
@Column(name = "PERSON_ID")
int personId;
String name;

@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
List<Vehicle> vehicles = new ArrayList<>();
//constructor is private
private Person() {
}
//getters and setters
}

这是我的测试类

public class TestClass {
public static void main(String[] args) {

EntityManagerFactory emf = Persistence.createEntityManagerFactory("vehiclePU");
EntityManager entityManager = emf.createEntityManager();

Person person = entityManager.find(Person.class, 0);
System.out.println("person = " + person);
person.getVehicles().forEach(System.out::println);

emf.close();


}
}

我的问题是

  1. 为什么允许将实体声明为最终实体并使用私有(private)无参数构造函数,因为根据 JPA 规范这是不允许的?
  2. 我知道对于延迟加载,hibernate 使用代理对象,而代理对象只不过是实体的子类,但是由于这里两个实体都被声明为最终实体,因此如何允许它们被子类化?

我还想知道延迟加载是如何工作的? Hibernate 默认使用哪个代理库,我们如何知道它使用哪个代理库?

我正在使用 Hibernate 5 和 JPA 2.1。

最佳答案

正如 Neil 所说:不需要支持具有私有(private)构造函数的最终类 - 但并不禁止。

但是,除了您失去提供程序独立性以及您将看到任何 JPA validator 发出的警告之外,您还将失去延迟加载

您确实谈到了延迟加载,但您的示例没有使用它。以下将适用于公共(public)非最终Person具有公共(public)或 protected 无参数构造函数的类:

@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Person person;

但正如 fetch 的 JavaDoc说:

The EAGER strategy is a requirement on the persistence provider runtime that the associated entity must be eagerly fetched. The LAZY strategy is a hint to the persistence provider runtime.

所以Hibernate不会提示错误LAZY - 但如果有什么东西阻止延迟加载,它会默默地忽略。例如,final 类,或私有(private)无参数构造函数或 optional=true (默认)没有字节码增强。

您可以通过使用不同的选项并检查 Hibernate 日志(检查 load 命令)以及使用 vehicle.getPerson().getClass() 来查看所有这些内容。 。

一旦您开始延迟加载并收到代理类,您就可以看到 Hibernate 使用的库:Javassist

关于java - JPA 延迟加载适用于最终实体和私有(private)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334515/

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