我使用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?
答案 0 :(得分:0)
看一下这篇文章@OneToMany List<> vs Set<> difference
使用Set或SortedSet ..而不是list也可以保证数据的完整性。
有时您必须覆盖equals
和hascode
,以便父实体只接受正确的子实体,例如,如果您有子实体{{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());
}
}