Hibernate关系映射 - 必须吗?

时间:2015-10-09 08:07:27

标签: java hibernate

在休眠中,我们可以将实体关系映射为一对一,一对多等等。我对使用关系注释持怀疑态度,我更喜欢使用单独的查找方法来检索子记录。例如,

让我们考虑一下有两个表,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并查询角色表?这是一种正确的方法吗?是的,我知道加载对象图的好处,但我认为这种方法可以避免不必要的急切提取,并且如果我们进行数据库分区,它将无缝运行。

(我一直认为数据库只是数据存储,并使用单独的查询来检索数据,而不是使用连接来避免加载数据库)。

请让我知道你的想法。

1 个答案:

答案 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