5

我有一个关于休眠的问题。

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

例如:对象 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 对象应该为空,因此首先没有加载 Group 对象?

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

谢谢

4

2 回答 2

5

正如 Firo 所说:

您是否禁用了延迟加载并将 fetchmnode 设置为加入,因为 NHibernate 必须获取它们以决定是否应该将其无效,并且它不能仅使用 id 来决定

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

为什么 Hibernate 会尝试加载“not-found=ignore”关联?

编辑:可能是你错过了@Fetch(FetchMode.JOIN).

于 2012-12-24T11:52:45.507 回答
0

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

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

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

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

我原以为它是用来解决我上面描述的问题,但它实际上定义了如果设置了 groupCode 但没有相应的 Group 该怎么办;不是当 groupCode 为空时该做什么。

其他人也可能为此而堕落。

于 2012-12-27T14:14:19.180 回答