hibernate 一對多,多對一 mappedBy用法詳解

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 
  @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 
  @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();         
/*
因爲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();
/* 
輸出如下:
Hibernate: insert into classes (name) 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); 
/*
輸出如下:
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();        
    } 
  } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章