Hea*_*vyE 11 java persistence annotations hibernate
使用@ElementCollection时,load all正在加载对象的多个实例.更具体地说,它为collectionOfStrings中的每个元素加载一个实例.
例如,具有myClass的单个实例且具有collectionOfStrings.size()== 4的数据库,对加载所有MyClass值的调用将返回大小为4的List(所有相同的对象),而不是仅返回1个对象.
是否有一种简洁明了的方法可以解决这个问题,还是预期的行为?
// Parent class is a @MappedSuperclass which may or may not be relevant to the issue
@Entity
public class MyClass extends ParentClass {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ElementCollection(fetch=FetchType.EAGER)
@IndexColumn(name="indexColumn")
private List<String> collectionOfStrings;
// other instance variables, constructors, getters, setters, toString, hashcode and equals
}
public class MyClassDAO_Hibernate extends GenericHibernateDAO<MyClass, Long> implements MyClassDAO {
@Override
public List<MyClass> loadAll() {
List<MyClass> entityList = null;
Session session = getSession();
Transaction trans = session.beginTransaction();
entityList = findByCriteria(session);
trans.commit();
return entityList;
}
}
protected List<T> findByCriteria(Session session, Criterion... criterion) {
Criteria crit = session.createCriteria(getPersistentClass());
for (Criterion c : criterion) {
crit.add(c);
}
return crit.list();
}
MyClassDAO myClassDAO = new MyClassDAO_Hibernate(); // in reality, implementation type is determined with a Factory
...
List<MyClass> myClassInstances = myClassDAO.loadAll();
Run Code Online (Sandbox Code Playgroud)
谢谢,HeavyE
编辑:添加了findByCriteria调用.
我不确定它是否是错误或合法行为,但可以通过应用DISTINCT_ROOT_ENTITY结果转换器来修复:
protected List<T> findByCriteria(Session session, Criterion... criterion) {
Criteria crit = session.createCriteria(getPersistentClass());
for (Criterion c : criterion) {
crit.add(c);
}
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return crit.list();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7473 次 |
| 最近记录: |