我最近用内存H2数据库替换了PostgreSql单元测试数据库。我无法弄清楚为什么几个测试失败,它与Postgre一起工作正常。有约。本应用程序中有280多个单元测试。失败的dao测试是从视图中选择,实体具有EmbeddedId,即该视图的列。 请参阅下面的代码(注意:我在编写此电子邮件时更改了名称,代码和sql以隐藏真实姓名,但这是使用Postgre数据库的工作单元测试)
<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 :(得分:1)
好的修复,我不得不使用较小的数字作为LOCK_TIMEOUT值,所以现在我可以连接到数据库并查看值。从视图问题中选择也已修复。
我不得不说H2真的很整洁。我很高兴,我将单元测试数据库切换到H2。