java - 在具有相同 id 的中央多对多关系表中的休眠中插入问题(它可以手动执行但不能自动执行)
问题描述
我开始开发一个休眠应用程序并手动进行插入,我创建了一个包含很多多对多关系的数据库,我也必须将这些关系插入到由关系创建的中央表中。我在寻找在这些表中进行插入的方法时遇到了一些问题,并试图在使用相同 ID 进行插入时不发生冲突,例如,语言学家可以有多个专业化,因此表看起来像这样:
所以我找到了一种使用这段代码的方法:
//create the linguist
Linguista user=new Linguista(1,"stack","overflow","mail@gmail.com","burundi","1-5","mylink","linkerio");
//create the specializations
Especializacion esp1 = new Especializacion(1,"espacial");
Especializacion esp2 = new Especializacion(2,"informatic");
//the I add the especializations to the users table and the user to the especializations table
user.getEspecializaciones().add(esp1);
user.getEspecializaciones().add(esp2);
esp1.getLinguistas().add(user);
esp2.getLinguistas().add(user);
//then create the transaction and save them in the database:
tx = session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
在这种情况下,它工作得很好,如果我用另一个 ID 重复 ID 或特化的名称,Hibernate 会发现有一条具有该名称的记录,并且不会创建另一个具有相同名称和不同 ID 的记录,链接它对语言学家来说就像在图像中一样。
问题是现在我正在自动执行相同的过程,从带有 selenium 的网页中获取信息,然后将其插入数据库中,我收到此错误:
org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[servicios.Servicio#49]
这是代码:
Session session = factory.openSession();
//create the linguist object
Linguista nuevo = new Linguista();
session.beginTransaction();
//taking the biggest id to do a +1 to that id (coudn't do it with the auto increment)
Linguista lingusitas= (Linguista) session.createQuery("FROM Linguista ORDER BY LinguistaID DESC").setMaxResults(1).uniqueResult();
int newid= lingusitas.getLinguistaid();
newid++;
nuevo.setLinguistaid(newid);
nuevo.setPlataforma("stackoverflow");
session.close();
// taking the data with Selenium
nuevo = RecogerDatosCuenta(nuevo, numero);
nuevo = RecogerDatosUsuario(nuevo);
nuevo = RecogerDatosExperiencia(nuevo);
System.out.println(nuevo.toString());
//inserting that linguist
session = factory.openSession();
session.clear();
session.beginTransaction();
session.save(nuevo);
session.getTransaction().commit();
session.close();
这里是 recogerdatosexperiencia 函数,我将 especilaization 与用户联系起来:
session = factory.openSession();
session.beginTransaction();
Especializacion espec=(Especializacion)session.createQuery("FROM Especializacion ORDER BY EspecializacionID DESC").setMaxResults(1).uniqueResult();
int newid= espec.getEspecializacionid();
newid++;
Especializacion newesp = new Especializacion(newid, datos.get(i));
linguista.getEspecializaciones().add(newesp);
newesp.getLinguistas().add(linguista);
return linguista;
我尝试使用合并而不是保存来完成它,它完美地完成了插入,但在特殊化表中生成了新文件,具有相同的特殊化名称但不同的 ID。
如果他们已经在数据库中,我该如何保存语言学家而不生成新的专业化字段,就像在第一张图片中一样?
谢谢你的帮助!!
解决方案
推荐阅读
- count - 我们可以缩小/扩大 OpenEBS Jiva 副本数量吗?
- sql - 获取值大于平均借款利率的日期
- javascript - 更改值新数组但旧数组未更改时如何解构数组
- rust - 是选项
安全放松吗? - c++ - 调配/修改数组访问
- tensorflow - 在 TensorFlow 1.10 中使用 tf.estimator.DNNRegressor 计算自定义指标
- css - 我们如何在悬停时使一个 div 在另一个 div 上可见
- angular - 使用 Angular 6 中的 takeWhile 使用 http 轮询 api 时没有响应
- html - 使用 flex-direction: row 使弹性项目使用父级的 100% 高度
- laravel - Laravel、Show()、Edit()、更新功能不起作用