Próbowałem uaktualnić hibernację z 4 do 5 w moim projekcie w 4.2
wersji 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.
Odpowiedzi:
Możesz również umieścić:
@GeneratedValue(strategy = GenerationType.IDENTITY)
I niech DateBase zarządza przyrostem klucza podstawowego:
źródło
INSERT
spowoduje 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.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>
źródło
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
.źródło
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.
źródło
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_mappings
wł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.
źródło
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źć
źródło
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 poszukujeschemaName.hibernate_sequence
która jest tabelą do generowania identyfikatorów na podstawie sekwencji.Kiedy używasz
GenerationType.SEQUENCE
jako strategii, musisz podać@TableGenerator
co 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.
źródło
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
do
źródło
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>
źródło
Możesz również umieścić:
@GeneratedValue(strategy = GenerationType.IDENTITY)
I niech DateBase zarządza przyrostem klucza podstawowego:
Powyższa odpowiedź mi pomogła.
źródło
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
źródło
Może to być spowodowane przez HHH-10876, który został naprawiony, więc upewnij się, że aktualizujesz do:
źródło
Hibernate 5.2.17.Final
jako implementacja. Nadal mam ten problem, kiedyGenerationType
jestAUTO
.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ć.
źródło
W moim przypadku, zastępując wszystkie adnotacje
GenerationType.AUTO
oGenerationType.SEQUENCE
rozwiązało problemu.źródło
Uruchom to zapytanie
create sequence hibernate_sequence start with 1 increment by 1
źródło