我已经开始将手工编写的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>
我在这里错过了什么吗?
答案 0 :(得分:1)
以为我会发布一个更新...我最终放弃了EBeans,而是将实现转换为使用MyBatis。 MyBatis太棒了;手册易于阅读和全面。 MyBatis做你期望它做的事。我马上就把它弄好了。
EBeans似乎没有检测到关联集合的连接导致了一堆空ID,但MyBatis干净地处理了这个场景。
答案 1 :(得分:1)
我遇到了同样的问题,并且能够通过向辅助表(StoreAlbum)添加标识列来解决它。我没有调查原因,但我认为在这种情况下Ebean需要一个主键。