为Hibernate设计对象
我需要一些关于设计问题的帮助。我很难理解如何设计一个对象(或者多个对象),这样我就可以查询我想要的方式 首先,让我显示一个sql查询,该查询准确返回我想要的信息:为Hibernate设计对象,hibernate,object,Hibernate,Object,我需要一些关于设计问题的帮助。我很难理解如何设计一个对象(或者多个对象),这样我就可以查询我想要的方式 首先,让我显示一个sql查询,该查询准确返回我想要的信息: select distinct rights_table.receiver_guid, user_info.name from rights_table inner join user_info on rights_table.receiver_guid = user_info.guid where rights_table.giv
select distinct rights_table.receiver_guid, user_info.name
from rights_table
inner join user_info
on rights_table.receiver_guid = user_info.guid
where rights_table.giver_guid = '_this_is_the_argument_'
因此,用户信息对每个用户都有一个条目。rights_表包含有关给予者\u guid已委托给接收者\u guid的权限的信息。我不在乎现在的权限是什么——我只是希望能够获得一个giver_guid,并获得一个列表,列出所有他授予权限的人的guid和姓名。我在概念化如何将这些表转换为对象模型时遇到了问题,无法执行该查询
如果有助于了解的话,接收者的guid和给予者的guid都是(可能都是)到用户的多对一映射。user_info.guid是该表上的主键;pk on rights_表是此处未提及的另一列
编辑:我的解决方案:
正如Tim所建议的,我在rights表“object”上放置了多对一映射,该表将rights表链接到User表。我花了一段时间才理解Hibernate在进行这样的映射时确实为您提供了连接隐式,因此我基本上为HQL提供了以下内容:
String hqlQuery =
"select right.recipient_guid, user.name " +
"from rightsTable right, userInfo user " +
"where right.recipient_guid = user.guid and right.giver_guid like :giver_guid";
老实说,我甚至不知道幕后是否有人加入,但我知道这给了我原本想要的信息。如果有人对如何更有效地进行此查询提出建议,请让我知道
如果这有助于了解,接收器和
给定者的guid都是(可能都是)
多对一映射到
用户\ u info.guid。用户\ u info.guid是
在那张桌子上;上的pk
rights_表不是另一列
这里提到过
我会尝试以下方法:
- 用户与正确的实体具有一对多关系“rightsGiven”
- 用户与正确的实体具有一对多关系“rightsReceived”
- 权利与用户之间有一对一的关系
- 权限与用户具有一对一的关系“givenTo”
X
获取获得某些权限的用户列表,请执行以下操作:
- 加载用户
X
- 遍历权限集合“righstGiven”
- 对于每个权限,获取“givenTo”用户
@OneToMany(fetch=FetchType.EAGER)
。在“rightsGiven”和“givenTo”上设置急切抓取
然后,您可以控制所谓的hibernate,以确保hibernate不会急切地加载整个图形。在本例中,我们有2个关系需要急切地获取(rightsGiven+givenTo),因此将其设置为2。这将导致查询具有两个外部联接。尝试将查询和表映射到对象很困难,因为概念模型差异太大。将SQL语句放在一边,仅从要推断的数据进行操作,我得到以下对象:
- 用户
(id、名称、设置
权限\u给定、设置 权限\u接收、信息等) - 右侧
(id、名称、级别、设置
分配、信息等) - 右翼言论
(id、给予者id、接收者id、右侧id、日期、信息…
RightsSignment中的字段将有一个关于给予者、接受者和权利的多个One,其中作为用户和权利将有一个由RightsSignment中的字段映射的多个One 要获得任何一个用户分配的权限列表,您只需查询RightsAssignment表中的条目,其中给定者的id与user.id匹配
希望这有帮助 具体来说:假设我有用户X——在Java中,“rightsGiven”字段将是我映射到另一个表的集合,对吗?所以,如果我遍历该集合,每个单独的值如何链接到“givenTo”用户?或者你是说我会在此时执行另一个查询?默认情况下,Hibernate会为您惰性地加载对象。但我希望在本例中,您可以将hibernate配置为急切抓取,并通过1个查询加载所有您想要的信息。ewernli说的与Tim的答案相同,但在我更好地理解映射之前,我并没有对此进行研究。我假设我在评论中的问题的答案是,当我遍历集合时,您建议的一对一将使我能够在每个对象上使用.givenTo()。这两个答案都会从一点伪代码中受益,但它们最终让我达到了我想要的目的。我用了Tim建议的多对一方法。我还不需要使用任何一对多映射,也没有使用集合,但这个建议很好,值得回答。@Nathan:在User&Right中的集合上添加OneToMany时,您也可以调用
somePersistantUserInstance.getRightsGiven()
或someRight.getAssignments()
。。正如所暗示的,这要求您具有持久实例引用,但它消除了手工编写HQL查询的需要。艾瑟威:很高兴我能帮忙!我把你的建议付诸实施了。与sql和hql查询相比,它缺少的一点是我不能指定不同的约束。因此,如果我调用.getRightsGiven(),然后循环遍历结果,如果我给了多个用户相同的权限,那么我就有了重复。与hql相比,我有一个改进的模型,