4

休止状態のバージョンを 4.0.1.Final から 5.0.7.Final に更新しました (Jboss 7 から Wildfly 10 への移植)。

問題: hibernate フレームワークは、ID 生成に mySequence ではなく hibernate_sequence を使用します。

Hibernate 設定: 下位互換性を維持するために、hibernate.id.new_generator_mappings は false 値として設定されます。

エンティティ構成: id フィールドには、次の JPA API で注釈が付けられます。

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "myGenerator")
@SequenceGenerator(name = "myGenerator", sequenceName = "MY_GENERATOR_SEQ")
@Column(name="ID")
private Long id;

DB 構成: MY_GENERATOR_SEQ シーケンスは、「INCREMENT BY 1」オプションで定義されます。

この問題は、H2 と Oracle DB の両方で発生します。

質問:実装を分析しましたが、それが Hibernate のバグなのか、それとも後方互換性のために私が行った不適切な構成なのかわかりません。


分析: サーバー起動時の Hibernate は初期化を取得します。SequenceStyleGenerator.configure メソッドは、Properties パラメータから値を取得しようとしたため、QualifiedName sequenceName を「hibernate_sequence」として定義します。この時点で、MY_GENERATOR_SEQ sequenceName が実行時に「sequence」キー (sequence=MY_GENERATOR_SEQ) を使用して Properties パラメーターに存在することに気付きましたが、取得戦略 (determineSequenceName) にはキーとして「sequence_name」が必要です。そのため、プロパティ パラメーターにシーケンス名を設定するために使用されるキーは、hibernate.id.new_generator_mappings=false のため非推奨のクラス org.hibernate.id.SequenceGenerator.SEQUENCE からのものですが、SequenceStyleGenerator クラスには org.hibernate.id.enhanced が必要です。 .SequenceStyleGenerator.

考えられる解決策:

  1. SequenceGenerator に設定する allocationSize=1 (hibernate.id.new_generator_mappings=false を設定せずに)
  2. INCREMENT BY 50 で DB にシーケンス MY_GENERATOR_SEQ を作成します (hibernate.id.new_generator_mappings=false を設定せずに)

どちらのソリューションも私のコンテキストには適用できません。したがって、適用可能な唯一の「解決策」は次のとおりです。Oracle および H2 に使用される方言を拡張し、次の方法で getNativeIdentifierGeneratorClass メソッドをオーバーライドします。

@Override
public Class getNativeIdentifierGeneratorClass() {
    if ( getIdentityColumnSupport().supportsIdentityColumns() ) {
      return IdentityGenerator.class;
    }
    else {
        //From hibernate-core 5.0.7.Final, org.hibernate.dialect.Dialect
        //the original return value was org.hibernate.id.enhanced.SequenceStyleGenerator.class
      return SequenceGenerator.class;
    }
  }

明らかに、org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter に ah-hoc 方言を使用して「databasePlatform」を設定します。

Hibernate コミュニティにも提出: https://hibernate.atlassian.net/browse/HHH-10656

4

0 に答える 0