Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA&;Ebean ORM:空集合不是空的_Orm_Jpa - Fatal编程技术网

JPA&;Ebean ORM:空集合不是空的

JPA&;Ebean ORM:空集合不是空的,orm,jpa,Orm,Jpa,我已经开始将一个项目从手工编写的JDBC ORM代码切换到Ebeans。到目前为止,一切都很好;Ebens轻便易用 然而,我遇到了一个严重的问题:当检索一个应该为空的一对多列表时,实际上其中只有一个元素。这个元素看起来像是某种代理对象,它具有所有空字段,因此它破坏了在集合中循环的代码 我在这里包含了缩写定义: @Entity class Store { ... @OneToMany(mappedBy="store",cascade=CascadeType.ALL,fetch=Fe

我已经开始将一个项目从手工编写的JDBC ORM代码切换到Ebeans。到目前为止,一切都很好;Ebens轻便易用

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

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

@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;
}
已知数据库包含“Sprint”的“store”行,“store\u album”表不包含该存储的任何行

JUnit测试在第二个断言中失败。它会找到一个包含1个元素的列表,这是某种损坏的StoreAlbum对象。调试器将对象显示为“com.lwm.catalogfeed.domain.StoreAlbum$$EntityBean”类型$test@1a5e68a“所有声明为nullable=false(可选=false)的字段的值均为null


我是不是遗漏了什么?

我想我应该发布一个更新。。。我最终放弃了Ebens,而是将实现切换到使用MyBatis。MyBatis非常棒;本手册易于阅读,内容详尽。MyBatis做你期望它做的事。我很快就把它修好了


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

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

我已打开SQL调试,并注意到查询正在对store\u album表执行“左外联接”:选择t0.store\u id c0,t0.store\u name c1,t0.platform\u name c2,t0.dsp\u id c3,t1.store\u id c4,t1.album_id c5、t1.dsp_id c6、t1.pricecode_id c7从门店t0左外加入门店_album t1在t1.store_id=t0.store_id其中t0.store_id=?按t0.store\u id订购必须有一种方法来改变这种行为
Store s = server.find(Store.class)
            .where()
            .eq("store_id",4)
            .findUnique();

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