JPA& Ebean ORM:空集合不为空

时间:2011-03-25 16:52:55

标签: orm jpa

我已经开始将手工编写的JDBC ORM代码切换到Ebeans。到目前为止它一直都很棒; Ebeans轻巧易用。

然而,我遇到了一个严重的问题:当检索一个应该为空的一对多列表时,实际上有一个元素。这个元素看起来是某种具有所有空字段的代理对象,因此它会破坏遍历集合的代码。

我在这里包含了缩写定义:

@Entity
class Store {
    ...
    @OneToMany(mappedBy="store",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    List<StoreAlbum> storeAlbums = new LinkedList<StoreAlbum>();
}

@Entity
class StoreAlbum {
    ...
    @ManyToOne(optional=false,fetch=FetchType.EAGER)
    @JoinColumn(name="store_id",nullable=false)
    Store store;
}

......是所有标准的getter和setter所在的地方。检索代码如下所示:

Store s = server.find(Store.class)
            .where()
            .eq("store_id",4)
            .findUnique();

Assert.assertEquals("Sprint",s.getStoreName());
Assert.assertEquals(0, s.getStoreAlbums().size());

已知数据库包含“Sprint”的“store”行,而“store_album”表不包含该商店的任何行。

JUnit测试在第二个断言上失败。它找到一个包含1个元素的列表,它是某种破坏的StoreAlbum对象。调试器将对象显示为“com.lwm.catalogfeed.domain.StoreAlbum$$EntityBean$test@1a5e68a”类型,其中所有字段都为空值,这些字段声明为nullable = false(和optional = false)。 / p>

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:1)

以为我会发布一个更新...我最终放弃了EBeans,而是将实现转换为使用MyBatis。 MyBatis太棒了;手册易于阅读和全面。 MyBatis做你期望它做的事。我马上就把它弄好了。

EBeans似乎没有检测到关联集合的连接导致了一堆空ID,但MyBatis干净地处理了这个场景。

答案 1 :(得分:1)

我遇到了同样的问题,并且能够通过向辅助表(StoreAlbum)添加标识列来解决它。我没有调查原因,但我认为在这种情况下Ebean需要一个主键。