2014-06-28 44 views
0

我使用休眠和SQL請求來訪問數據庫中的實體。我不使用預加載/延遲加載,因爲比ORM更喜歡使用SQL請求。有時候,我需要讓孩子實體的主要實體,所以接下來我做的:休眠一對多使用集而不是列表

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

,然後單擊下一步做什麼:

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

而且從列表中添加的所有元素使用迭代器來設置。然後我將這個childEntities設置爲主要實體。這是休眠的正常方式嗎?

而且爲什麼所有推薦使用Set而不是List在一對多關係中,但hibernate方法獲取實體列表.list()return List,not Set?

回答

0

看看這個帖子@OneToMany List<> vs Set<> difference

如果使用設置或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 
}