Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Hibernate设计对象_Hibernate_Object - Fatal编程技术网

为Hibernate设计对象

为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

我需要一些关于设计问题的帮助。我很难理解如何设计一个对象(或者多个对象),这样我就可以查询我想要的方式

首先,让我显示一个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.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”
要通过user
X
获取获得某些权限的用户列表,请执行以下操作:

  • 加载用户
    X
  • 遍历权限集合“righstGiven”
  • 对于每个权限,获取“givenTo”用户
一旦加载了on对象,当您遍历图形时,hibernate将为您惰性地加载对象。这可能导致hibernate在后台执行许多查询,尤其是问题。然后使用即时抓取,以便hibernate使用连接。例如,
@OneToMany(fetch=FetchType.EAGER)
。在“rightsGiven”和“givenTo”上设置急切抓取


然后,您可以控制所谓的hibernate,以确保hibernate不会急切地加载整个图形。在本例中,我们有2个关系需要急切地获取(rightsGiven+givenTo),因此将其设置为2。这将导致查询具有两个外部联接。

尝试将查询和表映射到对象很困难,因为概念模型差异太大。将SQL语句放在一边,仅从要推断的数据进行操作,我得到以下对象:

  • 用户
    (id、名称、设置权限\u给定、设置权限\u接收、信息等)
  • 右侧
    (id、名称、级别、设置分配、信息等)
  • 右翼言论
    (id、给予者id、接收者id、右侧id、日期、信息…
这样,RightsSignment(请原谅名称,将其更改为合适的名称)是用户向另一个用户分配权限,并带有可选的附加信息,如上面的assignment.date字段(您现在可能不需要它,但它使您的模型更具可扩展性)。
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相比,我有一个改进的模型,