Hibernate是否总是加载关联的对象,即使它可以为null?

时间:2012-12-24 11:33:31

标签: java hibernate annotations many-to-one

我有一个关于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上的关联对象(Group)可以为null。目前,当我加载一个特定的Person并抛出异常时,Hibernate会加载一个Group实例,因为它无法将exampleFieldId设置为null(因为它是一个基本类型)。

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

有没有人知道Hibernate是否加载了相关对象而不管它是否为null,或者我是否错过了一些重要的注释?

由于

2 个答案:

答案 0 :(得分:5)

如Firo所说:

  

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

来决定

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

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

修改:您可能遗漏了@Fetch(FetchMode.JOIN)

答案 1 :(得分:0)

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

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

groupCode 上方添加注释@Type(type =“org.hibernate.type.StringType”)可避免此问题。

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

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

其他人也可能因此而失望。