Duplicate entry for the key "PRIMARY" using JPA to save to the database

I have an error saving JPA in my database, the error occurs when I save the second file in the database. I have a requirement to import multiple data sets of 5 sheets each. There is a requirement to update each table, even if some of the same data already exists. I am currently getting the following error:

Error

17:26:35,315 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) SQL Error: 1062, SQLState: 23000 17:26:35,316 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) Duplicate entry '0' for key 'PRIMARY' 

Script Database

My script to create the database is as follows:

 CREATE DATABASE IF NOT EXISTS sampleDB; use sampleDB; CREATE TABLE IF NOT EXISTS `Table1`(`mcc` int(10) NOT NULL,`mnc` int(10) NOT NULL,`operator` varchar(50) DEFAULT NULL,`country` varchar(50) DEFAULT NULL, PRIMARY KEY (`mcc`,`mnc`))ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `Table2`(`tac` int(10) NOT NULL,`marketingName` varchar(50) DEFAULT NULL,`manufacturer` varchar(50) DEFAULT NULL, `accessCapability` varchar(200) DEFAULT NULL,`model` varchar(50) DEFAULT NULL,`vendorName` varchar(50) DEFAULT NULL, `ueType` varchar(20) DEFAULT NULL,`os` varchar(20) DEFAULT NULL,`inputMode` varchar(20) DEFAULT NULL,PRIMARY KEY (`tac`))ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `Table3`(`causeClass` varchar(10) NOT NULL,`description` varchar(255) NOT NULL,PRIMARY KEY (`causeClass`))ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `Table4`(`causeCode` int(5) NOT NULL,`eventId` int(5) NOT NULL,`description` varchar(255) DEFAULT NULL, PRIMARY KEY (`causeCode`,`eventId`) ON UPDATE NO ACTION))ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `Table5`(`baseDataTableId` int(11) NOT NULL AUTO_INCREMENT,`dateTime` DATETIME NOT NULL,`eventId` int(5) NOT NULL,`causeClass` varchar(10) NOT NULL, `ueType` int(15) NOT NULL,`market` int(10) NOT NULL,`operator` int(10) NOT NULL,`cellId` tinyint(2) DEFAULT NULL,`duration` smallint(7) DEFAULT NULL, `causeCode` int(5) NOT NULL,`neVersion` varchar(7) DEFAULT NULL,`imsi` varchar(255) DEFAULT NULL,`hier3Id` varchar(255) DEFAULT NULL,`hier32Id` varchar(255) DEFAULT NULL, `hier321Id` varchar(255) DEFAULT NULL,PRIMARY KEY (`baseDataTableId`))ENGINE=InnoDB; 

Hibernate Java Properties

My Hibernate properties are as follows:

 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="primary"> <jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source> <properties> <!-- Properties for Hibernate --> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.show_sql" value="false" /> <property name="hibernate.format_sql" value="false" /> </properties> </persistence-unit> </persistence> 

Java

Entity class example:

 @Entity @Table(name = "Table3") public class Table3 { @Id private int causeClass; private String description; public Table3(){} public Table3(int causeClass, String description) { super(); this.causeClass = causeClass; this.description = description; } // getters & setters } 

Any ideas how to solve this problem?

+6
source share
2 answers

Make sure you use the good EntityManager method to update existing objects. It seems that you are trying to perform a persist operation instead of merging for existing objects. While maintaining strength, try to catch an EntityExistsException or PersistenceException and in the catch block, call the merge method. For instance:

 save(Enity item){ try{ //Try to insert your entity by calling persist method } catch(EntityExistsException e){ //Entity you are trying to insert already exist, then call merge method } } 
+7
source

This error occurs when trying to update an existing domain object, for example

 User user=UserDao.getUserById(1); session.save(user); 

Hibernate will treat it as saving a new object, and it will find that a duplicate object exists.

Before updating an object, first download it from sleep mode, for example

 User updatedUser=(User)session.load(User.class, 1); updatedUser.setName("user name"); session.saveOrUpdate(updatedUser); 
+3
source

All Articles