I have an error with JPA persisting into my database, the error occurs when i persist a second file into the DB. I have a requirement to import numerous datasets, with 5 sheets each. There is a requirement to update each table even if some of the same data is already in there. At the moment i get 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'
Database Script
My script to create the DB 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;
Java Hibernate 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?
Hibernate is an Object-Relational Mapping (ORM) tool which is used to save the state of Java object into the database. It is just a specification. Various ORM tools implement it for data persistence. It is one of the most frequently used JPA implementation.
Annotation Type IdSpecifies the primary key of an entity. The field or property to which the Id annotation is applied should be one of the following types: any Java primitive type; any primitive wrapper type; String ; java. util. Date ; java. sql.
Be sure you are using the good EntityManager's method to update existing entities. It seems that your trying to do a persist operation instead of a merge for existing entities. When persisting antity, try to catch EntityExistsException or PersistenceException and in the catch block, call merge method. For example :
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
}
}
This error occurs when you try to update a domain object that already exists, like
User user=UserDao.getUserById(1);
session.save(user);
Hibernate will treat it like saving a new object and it will find that a duplicate object exists.
Before updating your object first load it from hibernate, like
User updatedUser=(User)session.load(User.class, 1);
updatedUser.setName("user name");
session.saveOrUpdate(updatedUser);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With