java - 在 hibernate 中的多个多对一关系的循环中保存唯一数据

标签 java mysql hibernate one-to-many many-to-one

我目前正在处理具有多个多对一关系的表,并且我正在尝试使用 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
...

从上面的示例中,我希望我的产品表最终只有两个条目(Razer 和 Yahoo),其中 Razer 与 Users 表中的 3 个条目关联,而 Yahoo 与 Users 表中的 1 个条目关联。

我还希望我的组表最终只有一个条目(“admin”),该条目与用户表上的四个条目相关联。

到目前为止,每当我收到新的数据行时,如何确保没有为“产品”和“组”表创建重复条目,而是引用现有条目 em>在那里?

例如,如果第 5 行的数据是:Razer Jacky admin,我如何确保用户表添加新条目“Jacky”,而该条目与条目“Razer”关联和“admin”已经创建,而不是在“产品和组”表中创建重复条目?

我正确的有缺陷的数据循环是这样的:

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

Set<Users> users = new HashSet<Users>();
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));

     users.add(utemp);

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

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

谢谢!

最佳答案

让我们继续您提供的示例。您想要插入新行 - Razer Jacky admin

这是一个两步过程 首先检查您的数据库中是否存在产品Razer和组admin。如果是则加载它们,如果没有则为它们创建新对象。

下一步相当简单,您只需通过添加在第一步中加载或创建的引用来保留用户数据。

希望这有帮助。

关于java - 在 hibernate 中的多个多对一关系的循环中保存唯一数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41560753/

相关文章:

java - Hibernate:将类保留为接口(interface)

java - 使用 Hibernate 用外部 id 注释类的正确方法是什么?

java - 使用 spring 框架 hibernate 的 bootstrap 验证表单

java - 对 Major.Minor.Incremental 字符串的 ArrayList 进行排序

mysql - 使用 passport+express+mysql+sequelize 进行用户注册

php - MySQL 数据库中的重复行

php - 如何在 PHP 和 MySQL 中使用任意字符从表中搜索

java - 在 JAVA 中用词汇信息(中心词)注释树库

java - 最大连续子序列和与序列

java - 从 JDK1.5 访问 VirtualMachine 和 HotspotVirtualMachine 类