【问题标题】:Hibernate One To Many using Set instead of List使用 Set 而不是 List 休眠一对多
【发布时间】:2014-06-28 14:09:34
【问题描述】:

我使用休眠和 SQL 请求来访问数据库中的实体。我不使用急切/延迟加载,因为我更喜欢使用 SQL 请求而不是 ORM。有时我需要获取主实体的子实体,所以接下来我会这样做:

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

然后做下一步:

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

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

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

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    看看这个帖子@OneToMany List<> vs Set<> difference

    使用 Set 或 SortedSet .. 代替列表也可以保证数据的完整性。

    有时您必须覆盖 equalshascode,因此父实体将只接受 正确 子实体,例如,如果您有一个子实体 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());
        }
    }
    

    大学

    import java.util.Set;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    
    @Entity
    public class College {
    
        @Id
        @GeneratedValue
        private Long idCollege;
    
        @OneToMany(mappedBy = "college")
        private Set<Student> students;
    
        @Column(name = "NAME")
        private String name;
    //other properties
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      相关资源
      最近更新 更多