春の4.2
バージョンを使用して、プロジェクトでhibernateを4から5にアップグレードしようとしました。このアップグレード後、更新メソッドを呼び出したときにスタックトレースで次のエラーが見つかりました。
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
アノテーション付きの自動インクリメントIDを変更しました
@GeneratedValue(strategy=GenerationType.AUTO)
それでもエラーは残ります。
また置くことができます:
@GeneratedValue(strategy = GenerationType.IDENTITY)
そして、DateBaseに主キーの増分を管理させます。
AUTO_INCREMENT PRIMARY KEY
Spring Bootの操作
以下の文字列を.application.propertiesに入れます
spring.jpa.properties.hibernate.id.new_generator_mappings=false
Hibernate 4.Xでは、この属性のデフォルトはtrue
です。
これがこのエラーの原因です。
使用しているデータベースがIDを生成する方法を探します。 MySqlまたはHSQSLには、自動的に増分する増分フィールドがあります。 PostgresまたはOracleでは、シーケンステーブルを使用します。シーケンステーブル名を指定しなかったため、hibernate_sequenceという名前のシーケンステーブルを探し、それをデフォルトとして使用します。そのため、おそらくデータベースにそのようなシーケンステーブルがなく、そのエラーが発生します。
「com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:テーブル 'mylocaldb.hibernate_sequence'が存在しません」という同じエラーが表示されました。
Spring mvc 4.3.7およびhibernateバージョン5.2.9を使用すると、spring Javaベースの構成を使用してアプリケーションが作成されます。次のように、@ Eva Mariamが言及したhibernate.id.new_generator_mappings
プロパティをコードに追加する必要があります。
@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;
}
そしてそれは魅力のように働いた。
参考までに
Hbmファイルを使用してO/Rマッピングを定義している場合。
次のことに注意してください。
Hibernate 5では、-シーケンス名のパラメーター名が変更されました。
次の設定はHibernate 4で正常に機能しました。
<generator class="sequence">
<param name="sequence">xxxxxx_seq</param>
</generator>
しかしHibernate 5では、同じマッピング設定ファイルが「hibernate_sequence does not exist」エラーを引き起こします。
このエラーを修正するには、パラメータ名must change to:
<generator class="sequence">
<param name="sequence_name">xxxxxx_seq</param>
</generator>
この問題により、2、3時間無駄になりました。
そしてどういうわけか、それについてドキュメントなしがあるように見えます。
Org.hibernate.id.enhanced.SequenceStyleGeneratorのソースコードを読んで理解する必要があります
hibernate 5.xでは、hibernate.cfg.xmlでset hibernate.id.new_generator_mappingsをfalseに追加する必要があります
<session-factory>
......
<property name="show_sql">1</property>
<property name="hibernate.id.new_generator_mappings">false</property>
......
</session-factory>
今日のように誰かがこの問題で髪を引き抜いた場合に備えて、変更するまでこのエラーを解決できませんでした
spring.jpa.hibernate.dll-auto=create
に
spring.jpa.properties.hibernate.hbm2ddl.auto=create
使用するとき
@GeneratedValue(strategy=GenerationType.AUTO)
または
@GeneratedValue
は、上記の短い方法であり、Hibernateは最適な生成戦略の決定を開始します。この場合は、
戦略としてGenerationType.SEQUENCE
、それがそれが探している理由です
schemaName.hibernate_sequence
は、シーケンスベースのID生成用のテーブルです。
戦略としてGenerationType.SEQUENCE
を使用する場合、次のように@TableGenerator
を指定する必要があります。
@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;
戦略を設定するとき
@GeneratedValue(strategy = GenerationType.IDENTITY)
。
hibernateがシーケンステーブルの検索を停止するため、元の問題は解決されます。
また置くことができます:
@GeneratedValue(strategy = GenerationType.IDENTITY)
そして、DateBaseに主キーの増分を管理させます。
AUTO_INCREMENT PRIMARY KEY
上記の答えは私を助けました。
私はSpring Boot
を使用していますが、これを修正する方法はapplication.properties
ファイルに次の行を追加することです。
spring.jpa.properties.hibernate.id.new_generator_mappings = false
私の場合、すべての注釈GenerationType.AUTO
をGenerationType.SEQUENCE
に置き換えることで問題が解決しました。
PostgresにHibernateシーケンスを追加しました。 PostGres Editorでこのクエリを実行します。
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
クエリを使用することの長所/短所を見つけますが、助けが必要な人はこれを使用できます。
これは HHH-10876 が原因である可能性がありますが、これは修正されているため、必ず以下に更新してください。