在休眠中,我们可以将实体关系映射为一对一,一对多等等。我对使用关系注释持怀疑态度,我更喜欢使用单独的查找方法来检索子记录。例如,
让我们考虑一下有两个表,User和Roles。每个用户都可以拥有一个角色。实体是,
class User {
@Column
private String name;
@OneToOne(mappedBy="role_id")
private Role role;
.... getter/setter....
}
class Role {
...
}
要么我们必须进行eager fetch,否则如果在当前会话之外访问该角色,它将导致延迟初始化异常。
而不是这个,我们应该有这样的映射吗?
class User {
@Column
private String name;
@Column
private Long roleId;
....
}
这样,只要我们需要角色详细信息,我们就可以从User对象获取role_id并查询角色表?这是一种正确的方法吗?是的,我知道加载对象图的好处,但我认为这种方法可以避免不必要的急切提取,并且如果我们进行数据库分区,它将无缝运行。
(我一直认为数据库只是数据存储,并使用单独的查询来检索数据,而不是使用连接来避免加载数据库)。
请让我知道你的想法。
答案 0 :(得分:2)
我建议使用
class User {
@Column
private String name;
@OneToOne(mappedBy="role_id")
private Role role;
.... getter/setter....
}
class Role {
...
}
在调用数据库选择两次时看不到意义。数据库可以handel加入良好并选择非常快,所以我没有看到手动执行它的意义。此外,使用此方法时,您可以轻松保存/更新/删除对象。
为避免延迟初始化异常,您可以使用Hibernate.initialize(Object obj),如此处所述How Hibernate.initialize() works。