2017-11-23 2 views
2

私は、単一のデータソースを持つ「シンプルな」Springブートアプリケーションを持っています。 次の構成は、私の構成で存在している:Hibernateは、別のスキーマで既に利用可能なときにシーケンスを生成しません。

spring: 
    jpa: 
    hibernate: 
     ddl-auto: update 
    properties: 
     hibernate: 
     default_schema: CORE 
flyway: 
    schemas: 
    - CORE 

と、次のIDジェネレーター

@Id 
@GeneratedValue(strategy = SEQUENCE, generator = "seq-pooled-lo") 
@GenericGenerator(
     name = "seq-pooled-lo", 
     strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
     parameters = { 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.INCREMENT_PARAM, 
         value = "50" 
       ), 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.OPT_PARAM, 
         value = "pooled" 
       ), 
       @org.hibernate.annotations.Parameter(
         name = SequenceStyleGenerator.SEQUENCE_PARAM, 
         value = "seq_pooled_lo_sequence" 
       ) 
     }) 

今私の問題は、以下の通りである。

私はこのアプリを起動すると、それが作成されます「CORE」スキーマ上のシーケンス。すべてうまく動作します。データの保存、取得は問題ありません。私はその後、アプリケーションの2番目のインスタンスを起動するが、異なるdefault_schema: SECONDを定義するためにYAMLファイルをオーバーライドすると、 "SECOND"スキーマで新しいシーケンスを生成しません。最初に "SECOND"スキーマを定義してアプリを起動し、 "CORE"で起動すると、 "CORE"ではなく "SECOND"スキーマでシーケンスが作成されます。

私は、両方のスキーマで異なるシーケンスを作成すると思います。なぜそれはしないのですか?

私はまた、欠落しているスキーマにシーケンスを手作業で追加しようとしましたが、悲しいことに、手助けしていないようです。

答えて

0

シーケンスを手動でスキーマに追加する場合。 あなたはのは、シーケンスを生成するためのSequenceRepositoryクラスを作成してみましょうdefaultSchema

で復帰シーケンスIDの例として
public class CustomIdGenerator implements IdentifierGenerator { 

    @Override 
    public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException { 
     SequenceRepository sequenceRepository = ApplicationContextProvider.getApplicationContext().getBean(SequenceRepository.class); 
     Environment env = ApplicationContextProvider.getApplicationContext().getBean(Environment.class); 

     String defaultSchema = env.getProperty("yourproperty.default_schema"); 

     return sequenceRepository.getSequence(defaultSchema); 

    } 
} 

をCustomIdGeneratorクラスを作成することができます。私は自分のデータベースがOracleであると仮定します。

NEXTVAL:インクリメントシーケンスと次の値

public interface SequenceRepository extends JpaRepository<Object,Long> { 
    @Query(value = "SELECT ?1.NEXTVAL FROM DUAL", nativeQuery = true) 
    Long getSequence(String sequenceName); 
} 

とCustomGeneratorクラス

@Id 
@GenericGenerator(name = "sequence_generator", strategy = "yourpackage.CustomIdGenerator") 
@GeneratedValue(generator = "sequence_generator") 
@Column(name = "id") 
private Long id; 
+0

を使用するエンティティだけで編集方針を返しますが、私は本当にCustomIdGeneratorが必要ですか?私はそれをやっているようにナイーブなアプローチがうまくいかない理由を知りたいです。 – Traspler

関連する問題