如何在ORM / Hibernate中处理两个实体之间的简单映射?

时间:2010-02-16 09:00:34

标签: hibernate orm

如何在一个简单的场景中最好地使用hibernate(帖子末尾的问题)

假设我在代码中有这个数据模型:

 class UserGroup
 {
 int id;
 String name;
 }

 class User
 {
 int id;
 String userName;
 }

对于User和UserGroup类,底层数据库表看起来与上面的类完全一样 现在,用户可以属于一个或多个用户组。

在名为USERGROUPMAP的数据库表中,这可以表示为:

USERID INT
USERGROUPID INT

在代码中,我将如何表示该关系?  我能想到的选择是:

选项1 :( UserGroup类包含属于它的用户的集合)

 class UserGroup
 {
 int id;
 String name;
 UserCollection usersThatBelongInThisGroup;
 }

选项2 :( User类包含它所属的组的集合)

 class User
 {
 int id;
 String name;
 UserGroupCollection groupsThatIBelongTo;
 }

选项3 :(重新命名一个名为USERGROUPMAP的数据库表的类。为了查明用户是否属于某个组等,需要在代码中检查此类)

 class UserGroupMap //Class that represents the USERGROUPMAP table.
 {
 int userId;
 int userGroupId;
 }

问题:

(A)如果我使用第3个选项,那么使用hibernate的好处在哪里(毕竟它只是另一个代表表的类)?  我的意思是,我应该能够在类或UserGroup类中定义一个集合,而hibernate应该为我处理USERGROUPMAP中的插入/更新。所以我认为这排除了选项3。

(B)如果我使用第一个选项,那么第二个选项中关于组的信息是什么意思? (因为它可能变得多余)

(C)同样,如果我使用第二个选项,那么第一个选项中的用户集合点是什么?

如何在像hibernate这样的ORM中解决这个问题?

2 个答案:

答案 0 :(得分:0)

对我来说,第一个问题是你如何实际使用你的对象。您是否需要更频繁地为用户查找组,或者为组创建用户? IMO应决定如何映射您的实体。

Hibernate允许您同时使用1)和2)。但是,如果您只在代码中实现1)(或者反之亦然),也可以轻松编写单独的查询来获取2)。当然,如果同时实现1)和2),则需要注意偏离默认的延迟提取策略 - 您可以轻松地使用单个急切提取查询加载所有用户和组。

答案 1 :(得分:0)

选项4(我相信Hibernate如何做到这一点):

 class UserGroup 
 { 
   int id; 
   String name; 
   UserCollection usersThatBelongInThisGroup; 
 } 

 class User 
 { 
   int id; 
   String name; 
   UserGroupCollection groupsThatIBelongTo; 
 }

通常,这些集合是延迟加载的,只有在需要时才会被访问,尽管如果需要可以加载它们。