我有一个关于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,或者我是否错过了一些重要的注释?
由于
答案 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时不要做什么。
其他人也可能因此而失望。