Ruhezustand-Sequenz existiert nicht


87

Ich habe versucht, den Ruhezustand in meinem Projekt mit der Frühlingsversion von 4 auf 5 zu aktualisieren 4.2. Nach diesem Upgrade habe ich den folgenden Fehler in meinem Stack-Trace gefunden, als ich eine Methode zum Aktualisieren aufgerufen habe.

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 

Ich habe die automatisch inkrementierte ID mit Anmerkungen geändert

@GeneratedValue(strategy=GenerationType.AUTO) 

Trotzdem bleibt der Fehler bestehen.


4
Versuchen Sie, in der Konfigurationsdatei `<prop key =" hibernate.id.new_generator_mappings "> false </ prop>
Eva Mariam

Antworten:


122

Sie können auch setzen:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Lassen Sie die DateBase die Inkrementierung des Primärschlüssels verwalten:

AUTO_INCREMENT PRIMARY KEY

13
Dies mag in einigen Fällen gut sein, hat aber einen offensichtlichen Nachteil: Jeder INSERTwird einen zusätzlichen Roundtrip zur Datenbank verursachen, um die ID abzurufen. Also, wenn dieser Nachteil akzeptabel ist, gut.
G. Demecki

@ G.Demecki Könnten Sie die Vor- und Nachteile der Verwendung des Identitätsgenerators für den Ruhezustand im Gegensatz zu dieser Roundtrip-Methode diskutieren? Wäre wirklich nützlich!
Jordan Mackie

82

Sie müssen für Hibernate5.x einstellen <property name="hibernate.id.new_generator_mappings">false</property>.. siehe und verlinken .

Für ältere Versionen von Hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


Wo wird das hinzugefügt?
Samuel Thompson

1
Fügen Sie dies in den Eigenschaften für den Ruhezustand hinzu.
rParvathi


9
Ihre Antwort könnte die Lösung der Frage sein, erklärt jedoch nicht, warum das Problem dadurch behoben wird. Bitte beachten Sie, dass Links zum Absterben neigen.
Clijsters

50

Arbeiten mit Spring Boot

Lösung

Fügen Sie die folgende Zeichenfolge in .application.properties ein

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

Erläuterung

In Hibernate 4.X ist dieses Attribut standardmäßig true.


28

Dies ist der Grund für diesen Fehler:

Es wird untersucht, wie die von Ihnen verwendete Datenbank IDs generiert. Für MySQL oder HSQSL gibt es Inkrementfelder, die automatisch inkrementiert werden. In Postgres oder Oracle verwenden sie Sequenztabellen. Da Sie keinen Sequenztabellennamen angegeben haben, wird nach einer Sequenztabelle mit dem Namen hibernate_sequence gesucht und standardmäßig verwendet. Sie haben also wahrscheinlich keine solche Sequenztabelle in Ihrer Datenbank und jetzt erhalten Sie diesen Fehler.


1
sollte als Antwort markiert werden, da dies die Dinge einfach erklärt - natürlich sollte ein Zusatz von "spring.jpa.properties.hibernate.id.new_generator_mappings = false" erwähnt werden, aber danke.
Nachtwut

15

Ich habe den gleichen Fehler erhalten "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tabelle 'mylocaldb.hibernate_sequence' existiert nicht".

Unter Verwendung von Spring MVC 4.3.7 und Hibernate Version 5.2.9 erfolgt die Anwendung mithilfe der Spring Java-basierten Konfiguration. Jetzt muss ich die hibernate.id.new_generator_mappingsvon @Eva Mariam erwähnte Eigenschaft wie folgt in meinen Code einfügen:

@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;
    }

Und es funktionierte wie Charme.


14

Zu Ihrer Information

Wenn Sie hbm-Dateien verwenden, um die O / R-Zuordnung zu definieren.

Beachte das:

In Hibernate 5 wurde der Parametername für den Sequenznamen geändert .

Die folgende Einstellung hat in Hibernate 4 einwandfrei funktioniert :

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

In Hibernate 5 verursacht dieselbe Zuordnungseinstellungsdatei jedoch den Fehler "hibernate_sequence existiert nicht".

Um diesen Fehler zu beheben, muss der Parametername geändert werden in:

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

Dieses Problem hat mich 2, 3 Stunden verschwendet.

Und irgendwie sieht es so aus, als gäbe es kein Dokument darüber.

Ich muss den Quellcode von org.hibernate.id.enhanced.SequenceStyleGenerator lesen, um es herauszufinden


7

Wenn Sie verwenden

@GeneratedValue(strategy=GenerationType.AUTO)

oder

@GeneratedValue Hibernate beginnt, die beste Generierungsstrategie für Sie zu bestimmen, in diesem Fall hat sie ausgewählt

GenerationType.SEQUENCE als Strategie und deshalb sucht es

schemaName.hibernate_sequence Dies ist eine Tabelle für die sequenzbasierte ID-Generierung.

Wenn Sie GenerationType.SEQUENCEals Strategie verwenden, müssen Sie @TableGeneratorFolgendes bereitstellen .

     @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;

Wenn Sie die Strategie festlegen, ist es das zu

@GeneratedValue(strategy = GenerationType.IDENTITY) .

Das ursprüngliche Problem wurde behoben, da Hibernate dann nicht mehr nach Sequenztabellen sucht.


6

Nur für den Fall, dass sich jemand mit diesem Problem die Haare ausreißt, wie ich es heute getan habe, konnte ich diesen Fehler nicht beheben, bis ich mich geändert habe

spring.jpa.hibernate.dll-auto=create

zu

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

5

In Hibernate 5.x sollten Sie set hibernate.id.new_generator_mappings in hibernate.cfg.xml zu false hinzufügen

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

2

Sie können auch setzen:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Lassen Sie die DateBase die Inkrementierung des Primärschlüssels verwalten:

AUTO_INCREMENT PRIMARY KEY

Die obige Antwort hat mir geholfen.


2

Wenn Sie die Hibernate-Version vor Hibernate5 verwenden, @GeneratedValue(strategy = GenerationType.IDENTITY)funktioniert dies wie ein Zauber. Nach Hibernate5 ist jedoch die folgende Korrektur erforderlich.

@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

GRUND

Auszug aus dem Ruhezustand

Wenn derzeit hibernate.id.new_generator_mappings auf false gesetzt ist, wird @GeneratedValue (Strategie = GenerationType.AUTO) nativ zugeordnet. Wenn diese Eigenschaft wahr ist (dies ist der Standardwert in 5.x), wird der @GeneratedValue (Strategie = GenerationType.AUTO) immer SequenceStyleGenerator zugeordnet.

Aus diesem Grund verwenden wir in jeder Datenbank, die Sequenzen nicht nativ unterstützt (z. B. MySQL), den TABLE-Generator anstelle von IDENTITY.

Obwohl der TABLE-Generator portabler ist, verwendet er jedes Mal, wenn ein Wert aus der Datenbank abgerufen wird, eine separate Transaktion. Selbst wenn die IDENTITY JDBC-Stapelaktualisierungen deaktiviert und der TABLE-Generator den gepoolten Optimierer verwendet, skaliert die IDENTITY immer noch besser.


0

Dies kann durch HHH-10876 verursacht werden, das behoben wurde. Aktualisieren Sie daher auf:

  • Ruhezustand ORM 5.2.1,
  • Ruhezustand ORM 5.1.1,
  • Ruhezustand ORM 5.0.11

1
Ich verwende Spring-data-jpa, das intern Hibernate 5.2.17.Finalals Implementierung verwendet wird. Ich bekomme immer noch dieses Problem, wenn es GenerationTypeist AUTO.
TheCoder

0

Ich habe Hibernate-Sequenz in Postgres hinzugefügt. Führen Sie diese Abfrage im PostGres-Editor aus:

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

Ich werde die Vor- und Nachteile der Verwendung der Abfrage herausfinden, aber für jemanden, der Hilfe benötigt, kann dies verwendet werden.


0

In meinem Fall wurde das Problem behoben , indem alle Anmerkungen GenerationType.AUTOdurch ersetzt wurden GenerationType.SEQUENCE.


-2

Führen Sie diese Abfrage aus

create sequence hibernate_sequence start with 1 increment by 1

Bitten Sie Sie, die Details zu teilen, wie es das Problem löst und Ihre Antwort ist besser als die anderen Antworten ...
Suraj Kumar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.