Hibernate-シーケンスは存在しません


88

春の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) 

それでもエラーは残ります。


4
設定ファイル `<prop key =" hibernate.id.new_generator_mappings "> false </ prop>で設定してみてください
Eva Mariam 2015年

回答:


123

あなたも置くことができます:

@GeneratedValue(strategy = GenerationType.IDENTITY)

そして、DateBaseに主キーのインクリメントを管理させます。

AUTO_INCREMENT PRIMARY KEY

13
これは場合によっては良いかもしれませんが、明らかな欠点があります。すべての場合、INSERTIDをフェッチするためにデータベースへの追加のラウンドトリップが1回発生します。したがって、この欠点が許容できる場合は問題ありません。
G. Demecki 2016年

@ G.Demeckiは、このラウンドトリップ方法とは対照的に、休止状態のIDジェネレーターを使用することの長所と短所について説明できますか?本当に便利だろう!
ジョーダンマッキー2018

82

Hibernate5.xに設定する必要があり<property name="hibernate.id.new_generator_mappings">false</property>ます..参照してリンクしてください

古いバージョンのhibernate4.xの場合: <prop key="hibernate.id.new_generator_mappings">false</prop>


これはどこに追加されますか?
サミュエルトンプソン

1
これをHibernateプロパティに追加します。
rParvathi 2016


10
あなたの答えは質問の解決策かもしれませんが、それが問題を解決する理由を説明していません。リンクは消滅する傾向があることに注意してください。
クライシュテルス2018

51

作業春ブーツ

解決

以下の文字列を.application.propertiesに入力します

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

説明

Hibernate 4.Xでは、この属性のデフォルトはtrue。です。


30

これがこのエラーの背後にある理由です:

使用しているデータベースがどのようにIDを生成するかを探します。MySqlまたはHSQSLの場合、自動的にインクリメントするインクリメントフィールドがあります。PostgresまたはOracleでは、シーケンステーブルを使用します。シーケンステーブル名を指定しなかったため、hibernate_sequenceという名前のシーケンステーブルが検索され、デフォルトで使用されます。したがって、データベースにそのようなシーケンステーブルがない可能性があり、エラーが発生します。


1
これは物事を簡単に説明しているので、答えとしてマークする必要があります-もちろん、「spring.jpa.properties.hibernate.id.new_generator_mappings = false」の追加について言及する必要がありますが、感謝します。
ナイトフューリー

15

「com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:テーブル 'mylocaldb.hibernate_sequence'が存在しません」という同じエラーが発生していました。

Spring MVC 4.3.7とHibernateバージョン5.2.9を使用して、アプリケーションはSpringJavaベースの構成を使用して作成されます。次にhibernate.id.new_generator_mappings、@ EvaMariamによって言及されたプロパティを次のようにコードに追加する必要があります。

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

そしてそれは魅力のように働いた。


14

ご参考までに

hbmファイルを使用してO / Rマッピングを定義している場合。

次のことに注意してください。

Hibernate 5では、シーケンス名のパラメーター名が変更されました

次の設定はHibernate4で正常に機能しました:

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

ただし、Hibernate 5では、同じマッピング設定ファイルで「hibernate_sequenceが存在しません」というエラーが発生します。

このエラーを修正するには、パラメータ名を次のように変更する必要があります

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

この問題は私を2、3時間無駄にしました。

そして、どういうわけか、それについての文書ないように見えます。

org.hibernate.id.enhanced.SequenceStyleGeneratorのソースコードを読んで理解する必要があります


7

使用する場合

@GeneratedValue(strategy=GenerationType.AUTO)

または

@GeneratedValue 上記の簡単な方法ですが、Hibernateはあなたに最適な生成戦略を決定し始めます。この場合、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がシーケンステーブルの検索を停止するため、元の問題は解決されます。


6

今日のように誰かがこの問題で髪を抜いた場合に備えて、私が変更するまでこのエラーを解決できませんでした

spring.jpa.hibernate.dll-auto=create

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

5

hibernate 5.xでは、hibernate.cfg.xmlでsethibernate.id.new_generator_mappingsをfalseに追加する必要があります

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

2

あなたも置くことができます:

@GeneratedValue(strategy = GenerationType.IDENTITY)

そして、DateBaseに主キーのインクリメントを管理させます。

AUTO_INCREMENT PRIMARY KEY

上記の答えは私を助けました。


1

Hibernate5より前のHibernateバージョンを使用している場合は@GeneratedValue(strategy = GenerationType.IDENTITY)、チャームのように機能します。ただし、Hibernate5を投稿すると、次の修正が必要になります。

@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

理由

休止状態の問題からの抜粋

現在、hibernate.id.new_generator_mappingsがfalseに設定されている場合、@ GeneratedValue(strategy = GenerationType.AUTO)はネイティブにマップされます。このプロパティがtrue(5.xのデフォルト値)の場合、@ GeneratedValue(strategy = GenerationType.AUTO)は常にSequenceStyleGeneratorにマップされます。

このため、シーケンスをネイティブにサポートしていないデータベース(MySQLなど)では、IDENTITYの代わりにTABLEジェネレーターを使用します。

ただし、TABLEジェネレーターは移植性が高くなりますが、データベースから値がフェッチされるたびに個別のトランザクションを使用します。実際、IDENTITYがJDBCバッチ更新を無効にし、TABLEジェネレーターがプールされたオプティマイザーを使用している場合でも、IDENTITYのスケーリングは向上します。


0

これは、修正されたHHH-10876が原因である可能性があるため、必ず次のように更新してください。

  • Hibernate ORM 5.2.1、
  • Hibernate ORM 5.1.1、
  • Hibernate ORM 5.0.11

1
内部でHibernate 5.2.17.Final実装として使用しているSpring-data-jpaを使用しています。である場合でも、この問題が発生しGenerationTypeますAUTO
TheCoder 2018年

0

postgresでHibernateシーケンスを追加しました。PostGresEditorでこのクエリを実行します。

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

クエリを使用することの長所/短所を見つけますが、助けが必要な人はこれを使用できます。


0

私の場合、すべての注釈をで置き換えることで問題GenerationType.AUTOGenerationType.SEQUENCE解決しました。


-2

このクエリを実行する

create sequence hibernate_sequence start with 1 increment by 1

それがどのように問題を解決し、あなたの答えが他の答えよりも優れているかについての詳細を共有するようにあなたに要求してください...
SurajKumar19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.