我对 Hibernate session get
方法感到困惑。我的理解是 get
方法总是返回真实对象而不是代理对象( ref )。
但在我的程序中,即使使用 get
方法,我也能获取代理对象。
我的场景:
我有两个表product
和company
。
产品 JPA:
@Entity
@Table(name = "PRODUCT")
public class Product {
@Id
@Column(name = "prd_id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "price")
private int price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cmp_id")
private Company company;
}
公司 JPA:
@Entity
@Table(name = "COMPANY")
public class Company {
@Id
@Column(name = "cmp_id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "address")
private String address;
@Column(name = "revenue")
private int revenue;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
private List<Product> products;
}
在我的主要方法中,我有以下代码:
Product product = (Product) session.get(Product.class, 1); // this product has cmp_id 1
System.out.println("Got product");
Company company = (Company) session.get(Company.class, 1);
System.out.println(company instanceof HibernateProxy); // this returns true
我知道由于延迟加载,Hibernate 将公司 1 作为来自 Product Product = (Product) session.get(Product.class, 1);
的代理对象。
但我期望 (Company) session.get(Company.class, 1);
返回普通对象。
从日志中,我看到 hibernate 确实访问了数据库并获取了 Company 对象的完整数据。这使得它更加困惑,如果 hibernate 拥有所有数据为什么仍然返回代理对象?
我的理解有误吗?如何确保 session get
返回正常对象而不是代理对象?
最佳答案
Hibernate 不会在每次调用 get
时访问数据库。
请参阅 JavaDocs 以获取:If the instance is already associated with the session, return that instance. This method never returns an uninitialized instance.
因此,由于使用 session.get(Product.class)
session 中已经有一个 Company 实例(尽管是一个代理),因此 Hibernate 只是初始化该代理(因此是您看到的 sql)。
关于java - Hibernate session get方法返回代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48115736/