【问题标题】:Hibernate relationship mappings - must?休眠关系映射 - 必须吗?
【发布时间】:2015-10-09 08:07:27
【问题描述】:

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

假设我有两个表,用户和角色。每个用户可以拥有一个角色。所以实体是,

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

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

请告诉我你的想法。

【问题讨论】:

  • 当然,这是可能的。如果您遇到严重的性能问题,这可能是一个解决方案。不幸的是,您失去了对象之间的关系:查看数据库可能很清楚用户和角色是相关的(例如,如果有外键),但如果其中一位开发人员只查看代码,他可能会错过关系。
  • 我认为您在这里偏离了目标,尤其是最后当您说“而不是使用连接来避免数据库上的负载”时。这意味着您还没有进行任何认真的数据库工作,因为联接不仅是必需的,而且是一件美丽的事情。考虑到您不是数据库专家,当您提出“嘿,为什么不这样做?”时,我会非常小心。你很可能是错的。请注意,我不是在侮辱你,我只是在陈述事实。
  • 为什么不是关系?我不明白这个问题?它们是否急切地获取,而不是使它们变得懒惰并使用带有 fetch 的 HQL 获取所有值。有问题吗?
  • @Kayaman 是的,我不是数据库专家。但是我已经看到,在负载较重时,更复杂的连接会严重影响数据库的性能。我可能错了,只是想了解其他人对此的想法。我的假设是,使用主键(简单查询)查询表与使用联接查询之间存在性能差异。如果我错了,请纠正我。
  • @OAD 这不是问题,如果听起来像一个问题,对不起。这个问题更多是关于理解他人的经历/想法。

标签: java hibernate


【解决方案1】:

我建议使用

class User {
   @Column
   private String name;

   @OneToOne(mappedBy="role_id")
   private Role role;
   .... getter/setter....
}

class Role {
  ...
}

没有看到调用数据库选择两次的意义。数据库可以很好地处理连接并且选择非常快,所以我认为手动执行它没有意义。此外,使用这种方法时,您可以轻松保存/更新/删除对象。

为避免延迟初始化异常,您可以使用 Hibernate.initialize(Object obj),如 How Hibernate.initialize() works 中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多