【问题标题】:hibernate lazy fetch not work properly休眠延迟获取无法正常工作
【发布时间】:2013-12-26 07:01:26
【问题描述】:

我正在使用休眠,播放框架为 1.2.4。
假设我有一个名为 Person 的模型和一个名为 IdentityInfo 的模型,关系是一个人只能有一个身份信息。
我想在 IdentityInfo 获取上使用惰性获取。这是我的模型代码:

public class Person {
    // ... some code

    @OneToOne(fetch = FetchType.lazy)
    @JoinColumn(name = "info_id_fk")
    private IdentityInfo info = null;

    public IndentityInfo getInfo(){
        return this.info;
    }

    public void setInfo(IdentityInfo  info){
        this.info = info;
    }
}

public class IdentityInfo {
  // ... some code
  public String xxx = null;

  public String getXxx(){
      return this.xxx;
  }

  public void setXxx(String xxx){
      this.xxx = xxx;
  }


}

但问题出在这里(很奇怪): 我有一个人员列表,我需要查看所有人员对象的身份信息。
并且某些人对象的身份无法正确加载(人有一个对应的身份信息)。
更详细, 当我使用 java reflect 获取此人的身份信息时,有时该信息的属性为空(但不是)。

但是当我简单地使用person.info.getXxx() 时,属性的值就出现了。

并且它没有任何错误消息。程序正常运行。

有人知道吗?

【问题讨论】:

  • 请提供准确的错误消息和/或堆栈跟踪
  • 没有错误信息。程序正常运行。
  • 所以getInfo返回null?您确定数据库包含与该人员的 info_id_fk 对应的 IdentityInfo 吗?如果没有,那么 getInfo 会返回 null 而没有错误是正常的。
  • 是的。这个人有一个 identityinfo_id_fk 并且 DB 包含一个相应的 IdentityInfo。
  • 尝试像这样增加日志记录:log4j.logger.org.hibernate.SQL=trace log4j.logger.org.hibernate.type=trace log4j.logger.org.hibernate.jdbc=debug 这个应该给出提示,如果没有,请发布失败的延迟提取和成功提取之一的日志

标签: hibernate fetch lazy-evaluation


【解决方案1】:

setter方法怎么没有参数?

试试这个

    public void setInfo(IndentityInfo info)
      {

       Hibernate.initialize(info);     
       this.info = info;

      }

【讨论】:

  • 原来问题是因为在Hibernate中,你应该使用Getter来获取属性,这样hibernate才会真正加载数据并初始化对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多