2017-09-17 4 views
0

ローカル開発のためのh2インメモリDBを持つバネブック(v 1.5.2)プロジェクトセットアップがあります。これはかなり新しいプロジェクトなので、従来のコード(まだ..)はhandle legacy id-generatorsにはありません。そこで、spring.jpa.hibernate.use-new-id-generator-mappings: trueと設定しました。h2 VS spring.jpa.hibernate.use-new-id-generator-mappings

src/main/resources/data.sqlを提供することによって、いくつかの初期データを追加します。ファイルにはinsertコマンドだけが含まれていますが、エンティティAの場合を考えてみましょう。

我々のエンティティは、設定下記IDジェネレータを有する:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

これは、しかし、次のエラーが発生し、別のエントリを格納しようとすると(即ちaRepo.save(newA))。

Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.A(ID)"; SQL statement: 
insert into a (something, id) values (?, ?) 

spring.jpa.hibernate.use-new-id-generator-mappings: falseを設定したり、初期データを挿入したりしないと、両方とも問題が解決されます。しかし、私たちはむしろ上記の設定がうまくいかない理由とそれを機能させることができるかどうかを理解したいと思います。

ありがとうございます! :-)

答えて

0

Hibernateは単純に各エントリのセッションを維持します。あなたのサービスで前のセッションを閉じる天気を確認してください。では、セッションを閉じてフラッシュしないでください。

データベース接続が正しく閉じられていません。

@Autowired 
SessionFactory sessionFactory; 
public <return Type> serviceFunction() { 
    session.save(newA); 
    session.flush(); 
    session.close(); 
} 

他のモデルクラスは、あなたのIDを変更できなかった各セッションを閉じる必要があります。これは同じままです。 それがあなたを助けてくれることを願っています。