【发布时间】: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 这不是问题,如果听起来像一个问题,对不起。这个问题更多是关于理解他人的经历/想法。