首页 > 解决方案 > 在具有相同 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。

合并而不是保存

如果他们已经在数据库中,我该如何保存语言学家而不生成新的专业化字段,就像在第一张图片中一样?

谢谢你的帮助!!

标签: javamysqlhibernate

解决方案


推荐阅读