2011-08-01 4 views
0

私は最近PostgreSqlユニットテストデータベースをメモリH2データベースに置き換えました。なぜ私はカップルのテストが失敗しているのか分からず、Postgreでうまくいきました。約ある。このアプリケーションで280以上のユニットテスト。失敗したDAOテストはビューから選択しています。エンティティには、そのビューの列であるEmbeddedIdがあります。 (注:私は名前、コードおよびこのメールを書くときに本当の名前を非表示にするには、SQLを変更しましたが、これはPostgre DBで作業ユニットテストだった)コードの下を参照してくださいH2のビューから選択すると動作しません

<pre> 

@Table(name = "item_view") // <- item_view is a database view 
public class ItemV implements Serializable 
{ 
    ..... 
    @EmbeddedId // <- entity has an embedded id 
    private ItemVId id; 
    ..... 

@Embeddable 
    public static class ItemVId implements Serializable //<- This is the embeddedId 
    { 
     @Column(name = "item_id", updatable=false, insertable=false) 
     private Long ItemId; //<- col no.1 of view 

     @Column(name = "item_type_id", updatable=false, insertable=false) 
     private Integer ItemTypeId; //<- col no.2 of view 
    .....  
ItemType is an enum 

And the view is 
CREATE OR REPLACE VIEW item_view AS 
     (  (  (  SELECT pt.id as item_id, cit.id as item_type_id 
            FROM xyz pt, item_type cit 
            WHERE pt.name::text = 'xyz'::text 
         UNION 
           SELECT z.id as item_id, cit.id as item_type_id 
            FROM zzz z, item_type cit 
            WHERE z.name::text = 'zzz'::text) 
       .............. 

and the dao method is 

    public ItemView find(Long itemId, ItemType itemType) 
    { 
     String hql = " from ItemV iv where iv.id.itemId = :itemId and iv.id.itemTypeId = :itemTypeId "); 
     List<ItemView> result = (List<ItemView>)getEntityManager() 
      .createQuery(hql) 
      .setParameter("itemId", itemId) 
      .setParameter("itemTypeId", itemType.getId()) 
      .setMaxResults(1) 
      .getResultList(); 
     return result.isEmpty() 
      ? null : result.get(0); 
    } 

このDAOメソッド常に空の結果を返し、ビュー内に既存の行を見つけることはありません???私はそれらの行が存在することを知っています。なぜなら、同じDAO上のgetAll()を実行すると結果が表示され、条件に一致する行が表示されるからです。

H2データベースのビューから行を選択する際に特別なことはありますか? ありがとう

+0

永続H2データベースを使用するとどうなりますか?最後の接続を閉じるときにメモリ内のデータベースの内容が失われます(デフォルト)。 –

+0

私はそれを試していない、私は "DB_CLOSE_DELAY = -1"を使用してdbがシャットダウンされていないことを確認しています。私はサーバー/ Webサーバーを作成しているので、テスト中にブレークポイントを置くと、ビューが存在することがわかります。ビュー内の何を見ることができません(後でエラーメッセージを投稿します)。そして、私は永続的なdbを使用して、あなたに知らせることを試みます。 – aug70co

+0

内部Webサーバーに接続すると、「タイムアウトでテーブルをロックしようとしています」というメッセージが表示され、テーブルがビューの基になるテーブルの1つです – aug70co

答えて

1

固定されて、私はLOCK_TIMEOUT値のために小さい番号を使用しなければならなかったので、今私はデータベースに接続して値を見ることができます。ビューの問題からの選択も修正されました。

私はH2は本当にきれいでエレガントだと言わなければなりません。私はうれしいです、私はH2にユニットテストのDBを切り替えました。

関連する問題