我有Order一个列表的类,OrderTransactions我用一对多的Hibernate映射映射它,如下所示:
@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
return orderTransactions;
}
Run Code Online (Sandbox Code Playgroud)
这些Order还有一个字段orderStatus,用于使用以下条件进行过滤:
public List<Order> getOrderForProduct(OrderFilter orderFilter) {
Criteria criteria = getHibernateSession()
.createCriteria(Order.class)
.add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));
return criteria.list();
}
Run Code Online (Sandbox Code Playgroud)
这有效,结果如预期.
现在这里是我的问题:为什么,当我明确地设置fetch类型时EAGER,Orders会在结果列表中多次出现?
@OneToMany(targetEntity = OrderTransaction.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
return orderTransactions;
}
Run Code Online (Sandbox Code Playgroud)
如何更改我的Criteria代码以使用新设置达到相同的结果?
我有一个实体,其中包含:
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
@OrderBy(value = "order ASC")
private List<AssessmentPart> assessmentParts = new LinkedList<>();
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment")
private List<AssessmentText> texts = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)
如你所见,有两个集合需要急切加载.这不起作用,hibernate引发异常:
Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Run Code Online (Sandbox Code Playgroud)
那是因为Hibernate无法一次性获取多个集合.但是,如果我改变List来Set和LinkedList到HashSet这部分工作正常,但其他-发生更恼人的问题.
当我试图从数据库中获取实体时使用:
entityManager.find(entityClass, primaryKey);
Run Code Online (Sandbox Code Playgroud)
它失败了:
org.hibernate.AssertionFailure: null identifier
Run Code Online (Sandbox Code Playgroud)
我确信我传递给find方法的ID 不是null,我已经调试过,我确信这一点.它在某种程度上消失在Hibernate内部.
如果我将集合类型更改为LAZY一切正常工作没有错误,但在某些情况下我需要使用EAGER.
有没有人有解决方法如何修复它?要么我可以有一个集,但防止发生断言错误或我可以有一个列表但不知何故避免多个获取包错误.
我在用:
Hibernate 4.2.2.Final
Tomcat 7
JPA 2.0
JDK 1.7
Run Code Online (Sandbox Code Playgroud)
编辑 …
以下是我的代码在这里,我使用多个列表从数据库中获取数据.从hql查询中获取数据时,它显示异常.
Pojo类
public class BillDetails implements java.io.Serializable {
private Long billNo;
// other fields
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>();
private Set productReplacements = new HashSet(0);
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillProduct> billProductList = new ArrayList<BillProduct>();
//getter and setter
}
Run Code Online (Sandbox Code Playgroud)
hmb.xml文件
<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
<id name="billNo" type="java.lang.Long">
<column name="bill_no" />
<generator class="identity" />
</id>
<bag name="billProductList" table="bill_product" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillProduct" />
</bag>
<bag name="billPaidDetailses" table="bill_paid_details" inverse="true" lazy="false" fetch="select">
<key>
<column name="bill_no" not-null="true" /> …Run Code Online (Sandbox Code Playgroud)