2016-04-13 8 views
1

Als allererstes habe ich manuell zehn Datensätze in meine Datenbanken aufgenommen. Dann habe ich das Projekt ausgeführt, es ging so schief: Duplizieren Sie den Eintrag '1' für den Schlüssel 'PRIMARY'. Dann habe ich die Seite neunmal aktualisiert, sie zeigte von "Eintrag duplizieren 2" für den Schlüssel "PRIMÄR" "bis" Eintrag "10" duplizieren für den Schlüssel "PRIMÄR". Schließlich wurde das Projekt normal, was bedeutet, dass ich den Artikel ab dem elften Datensatz in die Datenbank einfügen kann. Was ist los mit dir?com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Doppelter Eintrag '5' für Schlüssel 'PRIMARY'

Ich benutze den Winterschlaf in Version 5.10 endgültig. Und ich werde meinen Codeblock in dem folgenden zeigen:

Meine Verwirrung ist, dass die Tabelle, die von dem Projekt erstellt wurde, nicht für auto_increatement festgelegt wurde. wie folgend: pictures this is a picture

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 

     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 

     <property name="packagesToScan" value="com"/> 

     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop> 

       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 

       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 
      </props> 
     </property> 

     <property name="sharedCacheMode" value="ENABLE_SELECTIVE"/> 
    </bean> 
import org.hibernate.annotations.GenericGenerator; 
import org.springframework.format.annotation.DateTimeFormat; 

import javax.persistence.*; 
import java.util.Date; 


@Table(name = "sssp_empoyee") 
@Entity 
public class Employee { 

    private Integer id; 
    private String lastName; 
    private String email; 

    @DateTimeFormat(pattern = "yyyy-MM-dd") 
    private Date birth; 
    private Date crateTime; 
    private Department department; 

    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "increment") 
    @Id 
    public Integer getId() { 

     return id; 
    } 


@Transactional 
public void saveEmployee(Employee employee) { 

    employee.setCrateTime(new Date()); 

    respository.saveAndFlush(employee); 
} 

Fehler Info:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException : Duplicate entry '5' for key 'PRIMARY' 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
sun.reflect.DelegatingConstructorAccessorImpl.__newInstance(DelegatingConstructorAccessorImpl.java:45) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java) 
java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
com.mysql.jdbc.Util.getInstance(Util.java:381) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515) 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447) 
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) 
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) 
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554) 
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761) 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046) 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964) 
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949) 
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:147) 
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) 
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2921) 
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421) 
org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89) 
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560) 
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434) 
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295) 
org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1300) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
java.lang.reflect.Method.invoke(Method.java:498) 
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) 
com.sun.proxy.$Proxy35.flush(Unknown Source) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
java.lang.reflect.Method.invoke(Method.java:498) 
+0

Ich rechne damit, Ihren ID-Generator beginnt immer bei 0 wieder, wenn Sie starte dein Projekt neu, könnte das sein? –

+0

Die Originaldaten, die ich manuell in die Datenbank einfüge, beginnen bei 1. Es scheint, dass das Projekt seine eigenen IDs hat, aber nicht gemäß der ID der Datenbank. Ich habe die ID auto increatment eingestellt. Ich weiß nicht, wie ich dieses Problem lösen soll. – JSO

Antwort

0
@GeneratedValue(strategy=GenerationType.AUTO) 

Ich glaube, Sie Strategie als AUTO

Check this SO answer

verwenden müssen
+0

Danke! Ja, ich benutze diese Methode sehr fist, dann ging es schief, also habe ich mich dafür geändert. Schließlich stellte ich fest, dass die Tabellen, die von Projekt erstellt wurden, AUTO_Increatement nicht festgelegt haben, sein Kontrollkästchen ist falsch. – JSO

-1

MySql funktioniert wie folgt auf Einstellung:

@GeneratedValue(strategy = GenerationType.IDENTITY) 

dann wird es eine Tabelle mit der Funktion der auto_increment erstellen. Aber die Standardeinstellung @GeneratedValue wird kein Inkrement für Tabellen festlegen. Also das ist nicht der Schlüssel.

Jetzt, egal wie viele Originalsätze in meiner Datenbank, wird es nicht schief gehen mit der Fehlerinfo von "Eintrag duplizieren ...", wenn ich einen neuen Eintrag in die Datenbank einfüge.

0

Verwenden @GeneratedValue(strategy = GenerationType.IDENTITY)

0

Ihre Tabellenstruktur ändern, fügen Sie auto_increment auf die ID der Spalte in der Tabelle, mit der Abfrage unter:

ALTER TABLE document MODIFY COLUMN document_id INT auto_increment 
Verwandte Themen