2017-05-26 13 views
1

生産データベースはPostgresです。表の場合、非id列の1つのデータを生成するためにシーケンスを使用しています。このシーケンスはそうのように定義されており、フライウェイの移行から実行されます。このすべてが素晴らしい作品H2のシーケンスを使用すると、検索用の行を見つけることができません

@Generated(GenerationTime.INSERT) 
@Column(nullable = false, insertable=false, updatable=false) 
private Integer checkNumber; 

のPostgresに対して実行されている:

create sequence check_number_seq minvalue 1000 maxvalue 9999 cycle; 
alter table guest_check alter column check_number set default nextval('check_number_seq'::regclass); 

エンティティは、として定義された列を持っています。残念ながら、私たちがテストに使用しているH2に対して実行すると、うまくいきません。テストは、テーブルに対して実行する場合、それらはすべて同じエラーで失敗

create sequence IF NOT EXISTS check_number_seq minvalue 1000 maxvalue 9999 cycle; 
alter table guest_check alter column check_number set default nextval('check_number_seq'); 

しかし:私はH2で動作するようにシーケンス作成を少し変更したバージョンとのテストで実行する@Sqlスクリプトを追加しました:

org.springframework.orm.jpa.JpaSystemException: Unable to locate row for retrieval of generated properties: [com.foo.entity.thing.GuestCheck#1000]; 

私はH2モードを変えて、Postgresに変えようとしましたが、問題は解決しません。我々はスプリングブート1.5.1を使用しています。

今のところ、私たちはPostgres DBに対してテストを実行していますが、使いやすさのためにH2に戻ってみたいと思います。

+0

H2接続文字列とは何ですか?あなたは 'jdbc:h2:mem:play; MODE = PostgreSQL; LOCK_MODE = 0'のようなものを設定しますか? – StanislavL

+0

JPAではないため、 '@Generated(GenerationTime.INSERT)'は何か言いたいことがあります。デバッグを行うとJPAプロバイダのログが表示されます。 –

+0

@ StanislavLはい、それはまさに私が設定したものです。 – Gregg

答えて

0

非Idカラム(http://peter.risko.hu/java_incubator/h2_sequence_for_non_id_jpa.zip)の配列を使用するための最小限のテストを構築しました。

ただし、問題は再現できません。

これは私のDAOです:

@Entity 
@Table(name = "guest_check") 
public class GuestCheck { 

    @Id 
    @Column(nullable = false) 
    private String id; 

    @Generated(GenerationTime.INSERT) 
    @Column(nullable = false, insertable = false, updatable = false, name = "check_number") 
    private Integer checkNumber; 

    public Integer getCheckNumber() { 
     return checkNumber; 
    } 

    public void setCheckNumber(Integer checkNumber) { 
     this.checkNumber = checkNumber; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Override 
    public String toString() { 
     return "guestCheck, id: " + id + ", checkNo.:" + checkNumber; 
    } 
} 

そして、これは私のテストで:

@Test 
public void test() { 
    for (int i = 0; i < 10; i++) { 
     GuestCheck guestCheck = new GuestCheck(); 
     guestCheck.setId("id " + i); 
     guestCheckRepository.save(guestCheck); 
    } 

    List<GuestCheck> guestChecks = guestCheckRepository.findAll(); 
    for (GuestCheck guestCheck : guestChecks) { 
     System.out.println("guestCheck: " + guestCheck); 
    } 
} 

そして、これが出力されます:

guestCheck: guestCheck, id: id 0, checkNo.:1000 
guestCheck: guestCheck, id: id 1, checkNo.:1001 
guestCheck: guestCheck, id: id 2, checkNo.:1002 
guestCheck: guestCheck, id: id 3, checkNo.:1003 
guestCheck: guestCheck, id: id 4, checkNo.:1004 
guestCheck: guestCheck, id: id 5, checkNo.:1005 
guestCheck: guestCheck, id: id 6, checkNo.:1006 
guestCheck: guestCheck, id: id 7, checkNo.:1007 
guestCheck: guestCheck, id: id 8, checkNo.:1008 
guestCheck: guestCheck, id: id 9, checkNo.:1009 

は、たぶん私は何かを誤解?

+0

ありがとうございます。唯一の違いは 'DAOConfigH2'です。私はプロパティファイルのすべてを配線しています。メインアプリケーションクラスには、そのアノテーションごとに 'DAOConfigH2'のすべてを行う' @ SpringBootApplication'があります。それが違いを生むかどうかは分かりません。 – Gregg

関連する問題