双向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)建立关系,因为这样建立的关系是不会在数据库中存储的(应先保存非维护端,最后保存维护端)
原文地址:http://blog.csdn.net/hekewangzi/article/details/41594493