package oneToMany;
import java.util.Set;
import javax.persistence.*;
/*
注意導入時,是導入:import javax.persistence.*;
非導入org.hibernate的相關類:import org.hibernate.annotations.Entity;
*/
@Entity
@Table(name="classes")
public class Classes implements Serializable {
@Id
import java.util.Set;
import javax.persistence.*;
/*
注意導入時,是導入:import javax.persistence.*;
非導入org.hibernate的相關類:import org.hibernate.annotations.Entity;
*/
@Entity
@Table(name="classes")
public class Classes implements Serializable {
@Id
@Column(name = "CID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToMany(cascade=CascadeType.ALL,mappedBy="classes") //mappedBy內的意思是不維護級聯關係 則由student 一方維護
private Set<Student> students;
//getter,setter省略
}
package oneToMany;
import javax.persistence.*;
@Entity
@Table(name="student")
public class Student implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToMany(cascade=CascadeType.ALL,mappedBy="classes") //mappedBy內的意思是不維護級聯關係 則由student 一方維護
private Set<Student> students;
//getter,setter省略
}
package oneToMany;
import javax.persistence.*;
@Entity
@Table(name="student")
public class Student implements Serializable {
@Id
@Column(name = "SID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int sid;
private String sname;
//若有多個cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="classid",referencedColumnName="CID") //設置student表中對應Class表中的主鍵的外鍵屬性:classid 默認爲主鍵 相當於student表有一個外鍵爲:classid 指向Classes表的主鍵
private Classes classes;
//getter,setter省略
}
public class TestOneToMany {
/*
CREATE TABLE student ( --要定義外鍵!!!!!!!
`sid` double NOT NULL auto_increment,
`classid` double NULL,
`sname` varchar(255) NOT NULL,
PRIMARY KEY (sid),
INDEX par_ind (classid),
FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
*/
public static void main(String[] args) throws SQLException
{
try
{
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
@GeneratedValue(strategy=GenerationType.AUTO)
private int sid;
private String sname;
//若有多個cascade,可以是:{CascadeType.PERSIST,CascadeType.MERGE}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="classid",referencedColumnName="CID") //設置student表中對應Class表中的主鍵的外鍵屬性:classid 默認爲主鍵 相當於student表有一個外鍵爲:classid 指向Classes表的主鍵
private Classes classes;
//getter,setter省略
}
public class TestOneToMany {
/*
CREATE TABLE student ( --要定義外鍵!!!!!!!
`sid` double NOT NULL auto_increment,
`classid` double NULL,
`sname` varchar(255) NOT NULL,
PRIMARY KEY (sid),
INDEX par_ind (classid),
FOREIGN KEY (classid) REFERENCES classes(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
*/
public static void main(String[] args) throws SQLException
{
try
{
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
/*
因爲mappedBy是定義在classes中,即classes類不負責維護級聯關係.即維護者是student.所以,
1.要將clsses的數據,賦給student,即用student的setClasses()方法去捆定class數據;
2.在進行數據插入/更新session.save()/session.update()時,最後操作的是student.
*/
Classes classes=new Classes();
classes.setName("access");
Student st1=new Student();
st1.setSname("jason");
st1.setClasses(classes);
session.save(st1);
Student st2=new Student();
st2.setSname("hwj");
st2.setClasses(classes);
session.save(st2);
tx.commit();
Classes classes=new Classes();
classes.setName("access");
Student st1=new Student();
st1.setSname("jason");
st1.setClasses(classes);
session.save(st1);
Student st2=new Student();
st2.setSname("hwj");
st2.setClasses(classes);
session.save(st2);
tx.commit();
/*
輸出如下:
Hibernate: insert into classes (name) values (?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
*/
/*
因爲一端維護關係另一端不維護關係的原因,我們必須注意避免在應用中用不維護關係的類(class)建立關係,因爲這樣建立的關係是不會在數據庫中存儲的。
如上的代碼倒過來,則插入時,student的外鍵值爲空.如下:
*/
// Student st1=new Student();
// st1.setSname("jason");
// session.save(st1);
//
// Student st2=new Student();
// st2.setSname("hwj");
// session.save(st2);
//
// Set<Student> students=new HashSet<Student>();
// students.add(st1);
// students.add(st2);
//
// Classes classes=new Classes();
// classes.setName("access");
// classes.setStudents(students);
// session.save(classes);
// st1.setSname("jason");
// session.save(st1);
//
// Student st2=new Student();
// st2.setSname("hwj");
// session.save(st2);
//
// Set<Student> students=new HashSet<Student>();
// students.add(st1);
// students.add(st2);
//
// Classes classes=new Classes();
// classes.setName("access");
// classes.setStudents(students);
// session.save(classes);
/*
輸出如下:
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into student (classid, sname) values (?, ?)
Hibernate: insert into classes (name) values (?)
*/
}
catch(HibernateException e)
{
e.printStackTrace();
}
}
}
}
catch(HibernateException e)
{
e.printStackTrace();
}
}
}