Hibernate One to Many使用Set而不是List

时间:2014-06-28 14:09:35

标签: hibernate

我使用hibernate和SQL请求来访问DB中的实体。我不使用eager / lazy加载,因为更喜欢使用SQL请求而不是ORM。有时我需要为主要实体获取子实体,所以我接下来要做:

List<ChildEntity> tempList = (List<ChildEntity>) getSession()
    .createSQLQuery(SQL_QUERY)
    .addScalar(...)
    ...
    .list();

然后做下一步:

Set<ChildEntity> childEntities = new LinkedHashSet<ChildEntity>();

并使用迭代器添加列表中的所有元素。然后我将这个childEntities设置为主实体。这是休眠的正常方式吗?

并且为什么所有人都建议在一对多关系中使用Set而不是List,但是获取实体列表的hibernate方法.list()返回List,而不是Set?

1 个答案:

答案 0 :(得分:0)

看一下这篇文章@OneToMany List<> vs Set<> difference

使用Set或SortedSet ..而不是list也可以保证数据的完整性。

有时您必须覆盖equalshascode,以便父实体只接受正确的子实体,例如,如果您有子实体{{1}并且父母实体Student,每个学生都有一个必须是唯一的录取号码。

College

学院

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import com.google.common.base.Objects;

@Entity
public class Student implements Comparable<Student> {

    @Id
    @GeneratedValue
    private Long idCollege;

    @Basic
    @Column(name = "AD_NUM", unique = true)
    private String adminssionNumber;

    @ManyToOne
    @JoinColumn(name = "COL_ID")
    private College college;

    @Override
    public int compareTo(Student o) {
        return adminssionNumber.compareTo(o.adminssionNumber);
    }

    @Override
    public boolean equals(Object obj) {
        return obj == this || (obj instanceof Student && equals((Student) obj));
    }

    private final boolean equals(Student other) {
        return other != null && equal(adminssionNumber, other.adminssionNumber);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(adminssionNumber, getClass());
    }
}