保存多个多对一关系时的Hibernate优化

时间:2017-01-10 21:13:01

标签: java mysql hibernate

我目前正在处理具有多个多对一关系的表,我正在尝试使用Hibernate实现所有这些。

例如,我有三张桌子:

产品(id,pname),用户(id,pid,gid,uname),组(id,gname)

群组与用户的一对多关系

产品与用户的关系也是一对多的

用户与产品和组具有多对一关系。

我将收到的数据样本如下:

Line 0: pname   uname   gname
Line 1: Razer   Billy   admin
Line 2: Razer   Sally   admin
Line 3: Razer   Benji   admin
Line 4: Yahoo   Molly   admin
...

我对数据的正确缺陷循环如下:

// Three lists of same size created, 
// each list is a column of the sample data from above
// ...

for(int i = 0; i < plist.size; i++){
     Product ptemp = new Product(plist.get(i));
     Group gtemp = new Group(glist.get(i));
     Users utemp = new Users(ptemp, gtemp, ulist.get(i));

     Set<Users> users = new HashSet<Users>();
     users.add(utemp);

     ptemp.setUsers(users);
     gtemp.setUsers(users);

     session.save(ptemp);
     session.save(gtemp);
}

玩hibernate时,我也注意到当我将for循环更改为

for(int i = 0; i < plist.size; i++){
     Product ptemp = new Product(plist.get(i));
     Group gtemp = new Group(glist.get(i));
     Users utemp = new Users(ptemp, gtemp, ulist.get(i));

     session.save(ptemp);
     session.save(gtemp);
     session.save(utemp);
}

数据库上的结果与以前相同。

第二种方式是更好的休眠方式吗?或者是将依赖实体直接存储到数据库中的做法在hibernate中是不可接受的?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果我理解正确的问题是什么,在Hibernate中父/子关系时,相关对象应该以什么顺序存在?

您拥有的是一个Group对象,该对象具有双向关系中的User对象集合,以及与双向User对象集合相关的Product对象。如何管理这些类型的关系记录如下:

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#example-parentchild

Hibernate建议管理关系状态,这意味着子对象与父对象之间的链接与子对象的状态。

第一种和第二种方法可能有效,但它们可能会导致发出不同数量的sql语句以插入单个对象。这一切都取决于你如何映射关系。