2013-03-26 10 views
6

Ho un errore con persistente JPA nel mio database, l'errore si verifica quando persisto un secondo file nel DB. Ho l'obbligo di importare numerosi set di dati, con 5 fogli ciascuno. È necessario aggiornare ogni tabella anche se alcuni degli stessi dati sono già presenti. Al momento io ottenere il seguente erroreDuplica la voce per la chiave "PRIMARY" utilizzando JPA per persistere nel database

errore

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 di database

mio script per creare il DB è la seguente:

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 immobili

proprietà

mio Hibernate sono i seguenti:

<?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 esempio:

@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 

} 

Delle idee come risolvere questo problema?

+0

Non riesco a vedere le vostre classi di entità qui. Le proprietà id sono annotate con '@ GeneratedValue'? intendi metterlo da te? –

+0

Ho una tabella in cui ho impostato io stesso il parametro "@GeneratedValue" con autoIncrement e funziona bene (riesco a vedere i risultati dell'aggiornamento in mysql workbench) - inserirò un esempio di una delle entità che stanno fallendo ora - – user1694873

+0

You dovrebbe aggiungere '@ GeneratedValue' a' private int causaClass; ', a meno che non si chiami il costruttore' public Table3 (int causaClass, descrizione Stringhe) 'che consente di impostare manualmente la proprietà id –

risposta

7

Assicurarsi di utilizzare il buon metodo di EntityManager per aggiornare le entità esistenti. Sembra che tu stia cercando di eseguire un'operazione persistente invece di un'unione per entità esistenti. Quando si ostina a persistere, prova a catturare EntityExistsException o PersistenceException e nel blocco catch, chiama il metodo di unione. Per esempio:

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 
    } 
} 
+1

Questo è un applauso perfetto! Quello era il problema esatto che avevo - stavo chiamando persistente quando avrei dovuto chiamare la fusione, grazie. – user1694873

3

Questo errore si verifica quando si tenta di aggiornare un oggetto di dominio già esistente, come

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

Hibernate trattarlo come salvare un nuovo oggetto e si troverà che un duplicato l'oggetto esiste

Prima di aggiornare il tuo oggetto prima caricarlo dalla modalità di sospensione, come

User updatedUser=(User)session.load(User.class, 1); 
updatedUser.setName("user name"); 
session.saveOrUpdate(updatedUser); 
Problemi correlati