java - Hibernate session get方法返回代理对象

标签 java hibernate proxy

我对 Hibernate session get 方法感到困惑。我的理解是 get 方法总是返回真实对象而不是代理对象( ref )。

但在我的程序中,即使使用 get 方法,我也能获取代理对象。

我的场景:

我有两个表productcompany

产品 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/

相关文章:

java - 自定义回调处理程序

用于在 aws tomcat elastic beanstalk 上托管的 java 对象序列化

java - Hibernate session REST 性能/安全性

java - Spring Boot with postgres --> HikariPool-1 - 池初始化期间出现异常

hibernate - 在哪里可以找到 mavenized hibernate-annotations 3.6.10

proxy - 无法使用 mitmproxy 查看 WhatsApp 流量

javascript - ExtJS - 如何使用代理、模型?它们有什么关系?

java - java注释如何与spring一起工作,它们是在运行时还是在启动时扫描的?

java - sl4j loggback 配置同一记录器到两个不同级别的不同附加程序

http - 如何修复 ERR_INVALID_CHUNKED_ENCODING 错误?