標籤:hibernate 註解 一對多 多對一 關聯映射
雙向1-N:一般在‘一’的一端用mappedBy屬性反轉;把維護端交給‘多’的一端
One
import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name = "t_classes")public class Classes implements Serializable { private int id; private String name; private Set<Student> students; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } // mappedBy定義在Classes中,Classes類將不負責維護級聯關係.維護者交由Student.所以 // 1.要將Clsses的資料,賦給Student(用Student的setClasses()方法去捆定class資料) // 2.在進行資料插入/更新時,最後操作的是Student(維護端) @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, mappedBy = "classes") public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; }}
Many
import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;@Entity@Table(name = "t_student")public class Student implements Serializable { private int sid; private String sname; private Classes classes; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } @Column(name = "sname") public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } // 多個cascade:{CascadeType.PERSIST,CascadeType.MERGE} // 在多的一端指定外鍵(class_id) @ManyToOne(cascade = { CascadeType.ALL }) @JoinColumn(name = "class_id") public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; }}
因為一端維護關係另一端不維護關係的原因,必須注意避免在應用中用不維護關係的類(class)建立關係,因為這樣建立的關係是不會在資料庫中儲存的(應先儲存非維護端,最後儲存維護端)
Hibernate-----一對多關聯映射(註解)