1、问题出现的场景:两个Entity互相关联,我这里有两个类MessageMedel和CaseProcess,代码如下:
MessageModel类:
public class MessageModel extends Model {
@Id
@GeneratedValue
@OrderBy("id")
private long id;
@ManyToMany(fetch = FetchType.EAGER)
private List<Dict> recivers = new ArrayList<Dict>();
@ManyToOne
private Dict messageType;
// 关联多个CaseProcess对象
@OneToMany(cascade = CascadeType.ALL)
private List<CaseProcess> caseProcessList;
}
CaseProcess类:
@Entity
public class CaseProcess extends Model {
@Id
@GeneratedValue
private long id;
@ManyToOne
private Dict timerType;
@ManyToOne
private Dict caseGrade;
@ManyToOne
private Dict caseStatus;
// 关联一个MessageModel对象
@ManyToOne
private MessageModel messageModel;
} 其中MessageModel中caseProcessList关联多个CaseProcess,CaseProcess中关联一个MessageModel,当使用hibernateTemplate.findByCriteria(criteria, start, limit);分页查询时,会发生数据重复的现象。该方法参数中criteria是由以下方法获得的:
protected DetachedCriteria getConditions(String query,
Map<String, String> queryMap) {
return DetachedCriteria.forClass(this.entityClass);
} 问题就出在了return DetachedCriteria.forClass(this.entityClass);一句,如果是在MessageModelService中,该句在查询MessageModel(记为m1)时,会级联查询CaseProcess,而CaseProcess中又关联着一个MessageModel(记为m2),如果m1和m2在数据库中是同一条数据,则在hibernateTemplate.findByCriteria(criteria, start, limit);执行后,发生重复,解决办法是:
在MessageModelService中getConditions方法改写为:
@Override
protected DetachedCriteria getConditions(String query,
Map<String, String> queryMap) {
DetachedCriteria detachedCriteria = super
.getConditions(query, queryMap);
detachedCriteria.setFetchMode("caseProcessList", FetchMode.SELECT);
return detachedCriteria;
}
在CaseProcess中getConditions改写为:
@Override
protected DetachedCriteria getConditions(String query,
Map<String, String> queryMap) {
DetachedCriteria detachedCriteria = super
.getConditions(query, queryMap);
detachedCriteria.setFetchMode("messageModel", FetchMode.SELECT);
return detachedCriteria;
}
问题解决,这里特别感谢
http://blog.sina.com.cn/s/blog_6af9cfe80101277m.html这篇文章的作者!
|