我有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代码以使用新设置达到相同的结果?
是否有人知道Hibernate的有效性Criteria.list()和Query.list()返回多次出现的同一实体的方法?
我偶尔会发现在使用Criteria API时,在我的类映射定义中更改默认提取策略(从"select"到"join")有时会影响对同一实体的多少引用可以出现在结果输出中list(),并且我我不确定是否将此视为一个错误.javadoc没有定义它,只是简单地说"匹配的查询结果列表".(多谢你们).
如果这是预期和正常的行为,那么我可以自己重复删除列表,这不是问题,但如果它是一个错误,那么我宁愿避免它,而不是重复删除结果并试图忽略它.
有人有这方面的经验吗?
我有4张桌子 - store, catalog_galleries, catalog_images, and catalog_financials.
store --> catalog_galleries --> catalog_images换句话说,当我遍历关系时:store.getCatalogGallery().getCatalogImages()我得到重复的记录.有谁知道这可能是什么原因?关于在哪里看的任何建议?
该store表具有一种OneToOne关系,catalog_galleries该关系又具有OneToMany与之关系catalog_images和渴望获取类型.该store表也OneToMany与之有关系catalog_financials.
以下是相关实体:
商店实体
@Entity
@Table(name="store")
public class Store {
...
private CatalogGallery gallery;
...
@OneToOne(mappedBy="store")
public CatalogGallery getGallery() {
return gallery;
}
}
Run Code Online (Sandbox Code Playgroud)
CatalogGallery实体
@Entity
@Table(name="catalog_galleries")
public class CatalogGallery {
...
private Store store;
private Collection<CatalogImage> catalogImages;
...
@OneToOne
@PrimaryKeyJoinColumn
public Store getStore() {
return store;
}
@OneToMany(mappedBy="catalogGallery", …Run Code Online (Sandbox Code Playgroud)