La sequenza di ibernazione non esiste


88

Ho provato ad aggiornare Hibernate da 4 a 5 nel mio progetto con la 4.2versione primaverile . Dopo questo aggiornamento, ho trovato il seguente errore nella traccia dello stack quando ho chiamato un metodo per l'aggiornamento.

10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist 

Ho cambiato l'ID auto incrementato con annotazione

@GeneratedValue(strategy=GenerationType.AUTO) 

ancora l'errore rimane.


4
prova a impostare nel file di configurazione "<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

Risposte:


123

Puoi anche mettere:

@GeneratedValue(strategy = GenerationType.IDENTITY)

E lascia che DateBase gestisca l'incremento della chiave primaria:

AUTO_INCREMENT PRIMARY KEY

13
Questo potrebbe essere buono in alcuni casi, ma ha un ovvio svantaggio: ogni INSERTcauserà un ulteriore round trip al database per recuperare l'ID. Quindi, quando questo inconveniente è accettabile, va bene.
G. Demecki

@ G.Demecki saresti in grado di discutere i pro ei contro dell'utilizzo del generatore di identità di ibernazione in contrasto con questo metodo di andata e ritorno? Sarebbe davvero utile!
Jordan Mackie

82

È necessario impostare per Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. vedere e collegare .

Per la versione precedente di hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


dove viene aggiunto questo?
Samuel Thompson

1
aggiungilo nelle proprietà di ibernazione.
rParvathi


10
La tua risposta potrebbe essere la soluzione alla domanda, ma non spiega perché risolve il problema. Tieni presente che i collegamenti tendono a morire.
Clijsters

51

Lavorare con Spring Boot

Soluzione

Inserisci la stringa di seguito in .application.properties

spring.jpa.properties.hibernate.id.new_generator_mappings=false

Spiegazione

In Hibernate 4.X questo attributo è predefinito true.


30

Questo è il motivo dietro questo errore:

Cercherà come il database che stai utilizzando genera gli ID. Per MySql o HSQSL, ci sono campi di incremento che incrementano automaticamente. In Postgres o Oracle, usano le tabelle di sequenza. Poiché non hai specificato un nome per la tabella di sequenza, cercherà una tabella di sequenza denominata hibernate_sequence e la utilizzerà per impostazione predefinita. Quindi probabilmente non hai una tabella di sequenza del genere nel tuo database e ora ottieni quell'errore.


1
dovrebbe essere contrassegnato come una risposta poiché questo spiega le cose semplicemente - naturalmente un'aggiunta di "spring.jpa.properties.hibernate.id.new_generator_mappings = false" dovrebbe essere menzionata ma grazie.
furia notturna

15

Ricevo lo stesso errore "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: la tabella" mylocaldb.hibernate_sequence "non esiste".

Utilizzando spring mvc 4.3.7 e hibernate versione 5.2.9, l'applicazione è realizzata utilizzando la configurazione basata su spring java. Ora devo aggiungere la hibernate.id.new_generator_mappingsproprietà menzionata da @Eva Mariam nel mio codice in questo modo:

@Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) {

        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.addProperties(getHibernateProperties());
        sessionBuilder.addAnnotatedClasses(User.class);

        return sessionBuilder.buildSessionFactory();
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.id.new_generator_mappings","false");
        return properties;
    }

E ha funzionato a meraviglia.


14

Cordiali saluti

Se stai usando file hbm per definire la mappatura O / R.

Notare che:

In Hibernate 5, il nome del parametro per il nome della sequenza è stato modificato .

La seguente impostazione ha funzionato bene in Hibernate 4 :

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>

Ma in Hibernate 5 , lo stesso file di impostazione della mappatura causerà un errore "hibernate_sequence not exist".

Per correggere questo errore, il nome del parametro deve cambiare in:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>

Questo problema mi ha fatto perdere 2, 3 ore.

E in qualche modo, sembra che non ci siano documenti riguardo.

Devo leggere il codice sorgente di org.hibernate.id.enhanced.SequenceStyleGenerator per capirlo


7

Quando usi

@GeneratedValue(strategy=GenerationType.AUTO)

o

@GeneratedValue che è il modo più breve di quanto sopra, Hibernate inizia a decidere la migliore strategia di generazione per te, in questo caso ha selezionato

GenerationType.SEQUENCE come strategia ed è per questo che sta cercando

schemaName.hibernate_sequence che è una tabella, per la generazione di id basata su sequenze.

Quando si utilizza GenerationType.SEQUENCEcome strategia è necessario fornire @TableGeneratorquanto segue.

     @Id
     @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
     @TableGenerator(name = "user_table_generator",
                table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
     @Column(name = "USER_ID")
     private long userId;

Quando imposti la strategia, diventa

@GeneratedValue(strategy = GenerationType.IDENTITY) .

il problema originale viene risolto perché Hibernate smette di cercare la tabella delle sequenze.


6

Nel caso in cui qualcuno si tolga i capelli con questo problema come ho fatto oggi, non potrei risolvere questo errore finché non ho cambiato

spring.jpa.hibernate.dll-auto=create

per

spring.jpa.properties.hibernate.hbm2ddl.auto=create

5

in hibernate 5.x, dovresti aggiungere set hibernate.id.new_generator_mappings a false in hibernate.cfg.xml

<session-factory>
    ......
    <property name="show_sql">1</property>
    <property name="hibernate.id.new_generator_mappings">false</property>
     ......
 </session-factory>

2

Puoi anche mettere:

@GeneratedValue(strategy = GenerationType.IDENTITY)

E lascia che DateBase gestisca l'incremento della chiave primaria:

AUTO_INCREMENT PRIMARY KEY

La risposta di cui sopra mi ha aiutato.


1

Se stai usando la versione Hibernate precedente a Hibernate5, @GeneratedValue(strategy = GenerationType.IDENTITY)funziona a meraviglia. Ma dopo Hibernate5 è necessaria la seguente correzione.

@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator="native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;

DDL

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY

MOTIVO

Estratto dal problema di ibernazione

Attualmente, se hibernate.id.new_generator_mappings è impostato su false, @GeneratedValue (strategy = GenerationType.AUTO) viene mappato su native. Se questa proprietà è true (che è il valore predefinito in 5.x), @GeneratedValue (strategy = GenerationType.AUTO) viene sempre mappato a SequenceStyleGenerator.

Per questo motivo, su qualsiasi database che non supporta le sequenze in modo nativo (es. MySQL) utilizzeremo il generatore di TABELLA invece di IDENTITY.

Tuttavia, il generatore TABLE, sebbene più portabile, utilizza una transazione separata ogni volta che un valore viene recuperato dal database. In effetti, anche se IDENTITY disabilita gli aggiornamenti batch JDBC e il generatore TABLE utilizza l'ottimizzatore in pool, IDENTITY viene comunque ridimensionato meglio.


0

Ciò potrebbe essere causato da HHH-10876 che è stato risolto, quindi assicurati di aggiornare a:

  • Hibernate ORM 5.2.1,
  • Ibernazione ORM 5.1.1,
  • Hibernate ORM 5.0.11

1
Sto usando Spring-data-jpa che internamente utilizza Hibernate 5.2.17.Finalcome implementazione. Sto ancora riscontrando questo problema quando GenerationTypeè AUTO.
TheCoder

0

Ho aggiunto la sequenza Hibernate in postgres. Esegui questa query nell'editor PostGres:

    CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

Scoprirò i pro / contro dell'utilizzo della query, ma per qualcuno che ha bisogno di aiuto può usarlo.


0

Nel mio caso, in sostituzione di tutte le annotazioni GenerationType.AUTOdal GenerationType.SEQUENCErisolto il problema.


-2

Esegui questa query

create sequence hibernate_sequence start with 1 increment by 1

Ti chiedo di condividere i dettagli su come risolve il problema e la tua risposta è migliore delle altre risposte ...
Suraj Kumar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.