私は最近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データベースのビューから行を選択する際に特別なことはありますか? ありがとう
永続H2データベースを使用するとどうなりますか?最後の接続を閉じるときにメモリ内のデータベースの内容が失われます(デフォルト)。 –
私はそれを試していない、私は "DB_CLOSE_DELAY = -1"を使用してdbがシャットダウンされていないことを確認しています。私はサーバー/ Webサーバーを作成しているので、テスト中にブレークポイントを置くと、ビューが存在することがわかります。ビュー内の何を見ることができません(後でエラーメッセージを投稿します)。そして、私は永続的なdbを使用して、あなたに知らせることを試みます。 – aug70co
内部Webサーバーに接続すると、「タイムアウトでテーブルをロックしようとしています」というメッセージが表示され、テーブルがビューの基になるテーブルの1つです – aug70co