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

标签 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 中是更好的方法吗?或者将依赖实体直接存储到数据库的做法在 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/

相关文章:

java - Spring登录显示用户信息

java - AES 加密,InvalidKeyException : Unsupported key size: 6 bytes?

mysql - 如何在 mysql 表中插入西里尔符号?

php - OJS - 文章表中 "status"属性的值

mysql - MySQL中的表名区分大小写吗?

hibernate - Ehcache 存储但不检索(Ehcache + Hibernate)

java - 想要从 Gradle fat jar 中删除特定的 jar

java - 使用 Jackson 解析具有多个对象的 json 文件

java - @EnableWebMvc 以数组格式显示日期

hibernate - JPA Hibernate - 更改持久对象的主键