Hibernate查询返回多对多数据库关系的结果,而不会映射关系

时间:2011-03-27 13:56:35

标签: hibernate mapping many-to-many

在编写映射文件和理解映射实体的最佳实践时,我是Hibernate的新手。不一定是POJO。

我的数据库中rolemessage之间定义了多对多关系。这个想法是可以在此应用程序中为角色(思考用户组)分配消息,并且可以将消息分配给许多角色。这用于提供将消息传递给应用程序中的用户组的手段。

我不一定希望我的对象模型直接反映这种多对多关系。例如,我不一定希望我的Role对象能够了解有关Messages的任何信息,而且我并不希望Message上有一个Roles集合(尽管如果看起来这样最好,我可能会对此产生影响)。我的想法是,在这种情况下,我宁愿有一个服务

  • 用于加载消息:一组角色并返回适用的消息
  • 用于保存邮件:一个或多个角色及其适用的邮件

我目前同时映射了MessageRole,但我 映射了链接表message_role。< / p>

所以,我有几个关于如何查询角色消息的问题:

  • 我还应该为链接表创建映射吗?我相信我已经看到我不必在hibernate映射文件中声明class元素的name属性;声明映射而不必将其映射到POJO(而是给它一个实体名称)。我开始走这条路,但不确定如何映射表之后,因为该表实际上只包含一个复合键,主键中的每一列都是链表中的外键。
  • 所以,由于我不确定,我实际上正在使用一个看起来像这样的命名查询:

    &lt; sql-query name =“loadRoleMessages”&gt;

    <![CDATA[
    select m.*
    from message m
    right join message_role mr on m.message_id=mr.message_id
    where
    m.effective_date <= :date
    and m.expiration_date >= :date
    and mr.role_id in (:roleIds)
    ]]>
    

    &LT; / SQL查询&GT;

(抱歉,由于某种原因无法获取格式以包含sql-query标记)

这实际上有效,但我从查询中返回List<Object[]>而不是List<Message>。其中Object[]表示要返回的列。我理解这是因为查询没有引用Message实体,因此Hibernate不知道根据查询结果创建Message对象。根据我的发现,似乎无法将实体加入HQL中的非实体表。

所以,我只是在寻找一些输入(1)是否有一个首选/最佳实践来映射数据库中相关(多对多)的两个实体(角色/消息),但我不一定希望它们在POJO中如此映射。如果没有,我是否坚持使用我的sql-query然后只是在这个查询的情况下手动构建Message POJO?

1 个答案:

答案 0 :(得分:0)

我继续并映射了多对多关系,以便Message上有一组Roles。我认为这是可以的,它还应该简化为特定角色创建的持久消息,以便自动保持关系。我假设如果我以这种方式映射这种关系,那么我将不得不手动插入链表记录作为它自己的独立实体......这是不可取的/漂亮的。

如果还有其他角度我尚未考虑过,我仍然可以输入,但是现在我可以使用带有角色映射的Message。