我已经开始将一个项目从手工编写的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)时均为空值。
我是不是漏掉了什么?
发布于 2011-05-19 05:01:18
我想我应该更新一下这个...我最终放弃了EBeans,转而使用MyBatis实现。MyBatis非常棒;它的手册很容易阅读,而且很透彻。MyBatis做了您期望它做的事情。我很快就把它启动并运行起来了。
EBeans似乎没有检测到关联集合的联接导致了一堆空ids,但是MyBatis干净利落地处理了这个场景。
发布于 2013-11-15 15:32:28
我遇到了同样的问题,并能够通过向辅助表(StoreAlbum)添加一个标识列来解决它。我没有调查原因,但我认为在这种情况下,Ebean需要一个主键。
https://stackoverflow.com/questions/5435562
复制相似问题