我目前正在处理具有多个多对一关系的表,并且我正在尝试使用 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 中是更好的方法吗?或者将依赖实体直接存储到数据库的做法在 hibernate 中是 Not Acceptable ?
非常感谢您的帮助!
最佳答案
如果我理解正确的话,您所问的问题是,当涉及到 Hibernate 中的父/子关系时,相关对象应该以什么顺序保存?
您拥有的是一个 Group 对象,该对象具有双向关系中的 User 对象集合,以及一个与 User 对象集合也双向相关的 Product 对象。下面记录了如何管理这些类型的关系:
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#example-parentchild
Hibernate 建议根据子对象的状态来管理关系的状态,这意味着从子对象到父对象的链接。
第一种和第二种方法可能有效,但它们可能会导致发出不同数量的 sql 语句来插入各个对象。这完全取决于您如何映射关系。
关于java - 保存多个多对一关系时的 Hibernate 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578507/