【问题标题】:Does Hibernate always load associated object even if it can be null?Hibernate 是否总是加载关联的对象,即使它可以为空?
【发布时间】:2012-12-10 20:16:25
【问题描述】:

我有一个关于 Hibernate 的问题。

我有两个具有多对一关系的对象:

例如: 对象 1:

 public class Person {

 @Basic
 @Column(length = 50)
 protected String name;

 @NotFound(action=NotFoundAction.IGNORE)
 @ManyToOne(fetch = FetchType.EAGER)
 @JoinColumn(name = "groupCode", referencedColumnName = "code", updatable=false)
 protected Group group;

 ...all the getters and setters...
 }

对象 2:

 public class Group {
  @Id
  @Basic
  @Column(length = 3, nullable = false)
  protected String code;

  @Basic
  @Column(length = 30, nullable = false)
  protected String groupName;

   @Basic
   @Column(precision = 15, scale = 0)
   protected long exampleFieldId;

   ...rest of code....
  }

我试图让这个例子尽可能简单。我的问题是 Person 上的关联对象(组)可以为空。目前,当我加载特定的 Person 并引发异常时,Hibernate 会加载 Group 的实例,因为它无法将 exampleFieldId 设置为 null(因为它是原始类型)。

我可以通过将 long 更改为 Long 来停止此错误,但是,我会认为 Person 上的 Group 对象应该为 null,因此首先没有加载 Group 对象?

有谁知道 Hibernate 是否会加载关联的对象而不管它是否允许为空,或者我是否错过了一些重要的注释?

谢谢

【问题讨论】:

    标签: java hibernate annotations many-to-one


    【解决方案1】:

    正如 Firo 所说:

    您是否禁用了延迟加载并将 fetchmnode 设置为加入,因为 NHibernate 必须获取它们来决定是否应该取消它 它不能只用一个 id 来决定

    这似乎与您遇到的问题相同,即使它在 NHibernate 中也是如此。不过值得检查!

    Why does Hibernate attempt to load "not-found=ignore" associations?

    编辑:您可能缺少@Fetch(FetchMode.JOIN)

    【讨论】:

      【解决方案2】:

      我终于弄清楚了这里发生了什么,问题不在于 Hibernate。

      在代码的深处,我有一个将空字符串转换为空字符串的 UserType,这意味着 groupCode 实际上永远不会为空。因此 Hibernate 假设有一个子对象要加载。

      groupCode 上方添加注解 @Type(type="org.hibernate.type.StringType") 避免了这个问题。

      有趣的是,我误解了 @NotFound(action=NotFoundAction.IGNORE)。

      本来以为是用来解决我上面说的问题的,但其实它定义了如果设置了groupCode但是没有对应的Group怎么办;不是当 groupCode 为 null 时该做什么。

      其他人也可能上当。

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多