Sekwencja hibernacji nie istnieje


88

Próbowałem uaktualnić hibernację z 4 do 5 w moim projekcie w 4.2wersji wiosennej . Po tej aktualizacji znalazłem następujący błąd w moim śladzie stosu, gdy wywołałem metodę aktualizacji.

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 

Zmieniłem automatycznie zwiększany identyfikator z adnotacją

@GeneratedValue(strategy=GenerationType.AUTO) 

nadal błąd pozostaje.


4
spróbuj ustawić w pliku konfiguracyjnym `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

Odpowiedzi:


123

Możesz również umieścić:

@GeneratedValue(strategy = GenerationType.IDENTITY)

I niech DateBase zarządza przyrostem klucza podstawowego:

AUTO_INCREMENT PRIMARY KEY

13
Może to być dobre w niektórych przypadkach, ale ma oczywistą wadę: każda z nich INSERTspowoduje jedną dodatkową podróż w obie strony do bazy danych w celu pobrania identyfikatora. Więc jeśli ta wada jest do zaakceptowania, w porządku.
G. Demecki

@ G.Demecki czy byłbyś w stanie omówić zalety i wady używania generatora tożsamości hibernacji w przeciwieństwie do tej metody w obie strony? Byłoby naprawdę przydatne!
Jordan Mackie,

82

Musisz ustawić Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. zobacz i link .

W przypadku starszej wersji hibernacji 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


gdzie to zostanie dodane?
Samuel Thompson

1
dodaj to we właściwościach hibernacji.
rParvathi


10
Twoja odpowiedź może być odpowiedzią na pytanie, ale nie wyjaśnia, dlaczego rozwiązuje problem. Pamiętaj, że linki mają tendencję do umierania.
Clijsters

51

Praca z Spring Boot

Rozwiązanie

Umieść poniższy ciąg w .application.properties

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

Wyjaśnienie

W Hibernate 4.X ten atrybut ma wartość domyślną true.


30

Oto przyczyna tego błędu:

Będzie szukał sposobu, w jaki baza danych, której używasz, generuje identyfikatory. W przypadku MySql lub HSQSL istnieją pola przyrostowe, które zwiększają się automatycznie. W Postgresie czy Oracle używają tabel sekwencji. Ponieważ nie podałeś nazwy tabeli sekwencji, będzie szukał tabeli sekwencji o nazwie hibernate_sequence i użyje jej jako domyślnej. Więc prawdopodobnie nie masz takiej tabeli sekwencji w swojej bazie danych i teraz otrzymujesz ten błąd.


1
powinien być oznaczony jako odpowiedź, ponieważ wyjaśnia to po prostu - oczywiście należy wspomnieć o dodaniu „spring.jpa.properties.hibernate.id.new_generator_mappings = false”, ale dziękuję.
Nightfury

15

Otrzymuję ten sam błąd „com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tabela„ mylocaldb.hibernate_sequence ”nie istnieje”.

Używając spring mvc 4.3.7 i hibernacji wersji 5.2.9, aplikacja jest tworzona przy użyciu konfiguracji Spring Java. Teraz muszę dodać hibernate.id.new_generator_mappingswłaściwość, o której wspomniała @Eva Mariam w moim kodzie:

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

I zadziałało jak urok.


14

FYI

Jeśli używasz plików HBM do zdefiniowania mapowania O / R.

Zauważ, że:

W Hibernate 5 nazwa parametru dla nazwy sekwencji została zmieniona .

Następujące ustawienie działało dobrze w Hibernate 4 :

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

Ale w Hibernate 5 ten sam plik ustawień mapowania spowoduje błąd „hibernate_sequence nie istnieje”.

Aby naprawić ten błąd, nazwa parametru musi zmienić się na:

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

Ten problem zmarnował mi 2, 3 godziny.

I jakoś wygląda na to, że nie ma na ten temat żadnego dokumentu .

Muszę przeczytać kod źródłowy org.hibernate.id.enhanced.SequenceStyleGenerator, aby to rozgryźć


7

Kiedy używasz

@GeneratedValue(strategy=GenerationType.AUTO)

lub

@GeneratedValue co jest krótką drogą powyższego, Hibernate zaczyna wybierać najlepszą strategię generowania dla Ciebie, w tym przypadku wybrał

GenerationType.SEQUENCE jako strategia i dlatego jej poszukuje

schemaName.hibernate_sequence która jest tabelą do generowania identyfikatorów na podstawie sekwencji.

Kiedy używasz GenerationType.SEQUENCEjako strategii, musisz podać @TableGeneratorco następuje.

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

Kiedy ustawiasz strategię, to

@GeneratedValue(strategy = GenerationType.IDENTITY) .

pierwotny problem został rozwiązany, ponieważ Hibernacja przestała szukać tabeli sekwencji.


6

Na wypadek, gdyby ktoś wyrywał sobie włosy z tym problemem, tak jak ja dzisiaj, nie mogłem rozwiązać tego błędu, dopóki się nie zmieniłem

spring.jpa.hibernate.dll-auto=create

do

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

5

w wersji hibernate 5.x należy dodać ustawienie hibernate.id.new_generator_mappings na false w hibernate.cfg.xml

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

2

Możesz również umieścić:

@GeneratedValue(strategy = GenerationType.IDENTITY)

I niech DateBase zarządza przyrostem klucza podstawowego:

AUTO_INCREMENT PRIMARY KEY

Powyższa odpowiedź mi pomogła.


1

Jeśli używasz wersji Hibernate przed Hibernate5, @GeneratedValue(strategy = GenerationType.IDENTITY)działa jak urok. Ale po Hibernate5 konieczna jest następująca poprawka.

@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

POWÓD

Fragment z wydania hibernacji

Obecnie, jeśli hibernate.id.new_generator_mappings ma wartość false, @GeneratedValue (strategy = GenerationType.AUTO) jest mapowane na natywne. Jeśli ta właściwość ma wartość true (która jest wartością domyślną w 5.x), @GeneratedValue (strategy = GenerationType.AUTO) jest zawsze mapowana na SequenceStyleGenerator.

Z tego powodu na każdej bazie danych, która natywnie nie obsługuje sekwencji (np. MySQL), zamiast IDENTITY użyjemy generatora TABLE.

Jednak generator TABLE, choć bardziej przenośny, używa oddzielnej transakcji za każdym razem, gdy wartość jest pobierana z bazy danych. W rzeczywistości, nawet jeśli IDENTITY wyłącza aktualizacje wsadowe JDBC, a generator TABLE korzysta z puli optymalizatora, IDENTITY nadal lepiej skaluje się.


0

Może to być spowodowane przez HHH-10876, który został naprawiony, więc upewnij się, że aktualizujesz do:

  • Hibernacja ORM 5.2.1,
  • Hibernacja ORM 5.1.1,
  • Hibernacja ORM 5.0.11

1
Używam Spring-data-jpa, który wewnętrznie jest używany Hibernate 5.2.17.Finaljako implementacja. Nadal mam ten problem, kiedy GenerationTypejest AUTO.
TheCoder

0

Dodałem sekwencję Hibernate w postgres. Uruchom to zapytanie w edytorze PostGres:

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

Poznam zalety / wady korzystania z zapytania, ale ktoś, kto potrzebuje pomocy, może z tego skorzystać.


0

W moim przypadku, zastępując wszystkie adnotacje GenerationType.AUTOo GenerationType.SEQUENCErozwiązało problemu.


-2

Uruchom to zapytanie

create sequence hibernate_sequence start with 1 increment by 1

Poproś o podanie szczegółów, w jaki sposób rozwiązuje problem, a Twoja odpowiedź jest lepsza niż inne odpowiedzi ...
Suraj Kumar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.