@ElementCollection Java持久性(Hibernate)导致加载重复实例

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调用.

axt*_*avt 8

我不确定它是否是错误或合法行为,但可以通过应用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)