加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

@ElementCollection Java Persistence(Hibernate)导致加载重复实

发布时间:2020-12-14 05:09:41 所属栏目:Java 来源:网络整理
导读:当使用@ElementCollection时,加载全部正在加载对象的多个实例.更具体地说,它正在为collectionOfStrings中的每个元素加载一个实例. 例如,具有单个实例MyClass的数据库与collectOfStrings.size()== 4,调用加载所有MyClass值将返回一个大小为4的列表(所有相同的
当使用@ElementCollection时,加载全部正在加载对象的多个实例.更具体地说,它正在为collectionOfStrings中的每个元素加载一个实例.

例如,具有单个实例MyClass的数据库与collectOfStrings.size()== 4,调用加载所有MyClass值将返回一个大小为4的列表(所有相同的对象),而不是只有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();

谢谢,
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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读