2014-09-04 13 views
6

Ho un'entità che dovrebbe ottenere automaticamente un ID dal database. Io uso MySQL quindi mi aspetterei di annotare che @GeneratedValue(strategy=GenerationType.AUTO) si risolvesse in IDENTITY dietro le quinte e NON SEQUENCE. Tuttavia, quando provo a mantenere una nuova entità non riesce a dire che non è stato trovato hibernate_sequence. Ovviamente usa la strategia di sequenza anziché l'identità.JPA @GeneratedValue (strategy = GenerationType.AUTO) non funziona su MySQL

ho impostato il dialetto nella persistence.xml a: versione org.hibernate.dialect.MySQL5InnoDBDialect

Hibernate 4.2.0.CR1

Tutte le fonti che ho letto dice che dovrebbe usare l'identità durante la connessione a MySQL con auto come strategia.

+1

Pubblica il tuo entità? – CycDemo

risposta

6

Se si utilizzano gli identificatori migliorate:

properties.put("hibernate.id.new_generator_mappings", "true"); 

then the SequenceStyleGenerator is used, e dal momento che MySQL non supporta le sequenze it will fall-back to TABLE generator. Ecco perché cerca "hibernate_sequence", che è il nome della tabella di sequenza di default.

Nel caso in cui non si utilizzano i nuovi generatori, allora la strategia di generazione "nativo" è usato, che cercherà:

public Class getNativeIdentifierGeneratorClass() { 
    if (supportsIdentityColumns()) { 
     return IdentityGenerator.class; 
    } 
    else if (supportsSequences()) { 
     return SequenceGenerator.class; 
    } 
    else { 
     return TableHiLoGenerator.class; 
    } 
} 

Così sceglie da:

  • identità
  • sequenza
  • hilo

a seconda delle funzionalità del database corrente.

In questo caso per MySQL verrà sempre selezionata l'identità. Per ulteriori dettagli, check out this article.

1

AUTO significa lasciarlo fino all'implementazione JPA (vedere le specifiche JPA). IDENTITÀ significa utilizzare la capacità di incremento automatico se RDBMS lo supporta (mySQL lo fa). Sii specifico (usa IDENTITY) e funzionerebbe. Ciò ha apportato vantaggi se si è passati a un'implementazione JPA diversa con logica diversa per "AUTO"

0

È possibile utilizzare @GeneratedValue (strategia = GenerationType.IDENTITY) nel bean di entità. Ha funzionato per me sul database sql. Tuttavia l'entità non otterrebbe quell'ID dopo aver chiamato em.persist (la tua entità). Quindi dovresti chiamare em.refresh su quell'entità.

0
@Id 
@GeneratedValue(
    strategy= GenerationType.AUTO, 
    generator="native" 
) 
@GenericGenerator(
    name = "native", 
    strategy = "native" 
) 

uso questo generatore = "nativo" come il database non supporta le sequenze

Problemi correlati