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.

rParvathi
źródło
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
Kikou
źródło
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>

rParvathi
źródło
gdzie to zostanie dodane?
Samuel Thompson
1
dodaj to we właściwościach hibernacji.
rParvathi
JavaDocs, które Cię interesują - docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/cfg/ ...
muttonUp
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.

RivanMota
źródło
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.

Vishnu S Kumar
źródło
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.

Rajan Chauhan
źródło
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źć

Li Ying
źródło
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.

Kalpa
źródło
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
JMoney
źródło
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>
tekintian
źródło
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.

Pradeep Singarakannan
źródło
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ę.

Prasanth Rajendran
źródło
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
Vlad Mihalcea
źródło
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ć.

Chinmoy
źródło
0

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

wwesantos
źródło
-2

Uruchom to zapytanie

create sequence hibernate_sequence start with 1 increment by 1
user2179635
źródło
Poproś o podanie szczegółów, w jaki sposób rozwiązuje problem, a Twoja odpowiedź jest lepsza niż inne odpowiedzi ...
Suraj Kumar