2010年9月26日 星期日

Hibernate 教學 - 雙向一對一 (外鍵唯一)

Hibernate 再一對一當中有兩種情況,本篇先介紹 外鍵唯一的情況

在此情況中,我們可以看成 "多對一" 中,每個多的一方限制只能關連到唯一 一個 "一方"

這樣的情況下只要讓多的一方在資料表中的外鍵設定為唯一即可!!

以下舉一個 Customer 和 Address 的雙向例子,讓彼此都可參考到彼此



















以上的 多對一 即 Customer to Address ,接下來看一下如何將多對一轉成一對一

Customer.java
package MapPOJO;
public class Customer implements java.io.Serializable
{
    private Long id;
    private String name;
    private Address address;  //一個 Customer reference 一個 Address

    public Customer(){}

    public Long getId(){
        return id;
    }
    public void setId(Long id){
        this.id = id;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public Address getAddress(){
        return address;
    }
    public void setAddress(Address address){
        this.address = address;
    }
}

Address.java
package MapPOJO;
public class Address implements java.io.Serializable
{
    private Long id;
    private String address;
    private Customer customer;  //ㄧ個 Address reference 一個 Customer

    public Address(){}

    public Long getId(){
        return id;
    }
    public void setId(Long id){
        this.id = id;
    }
    public String getAddress(){
        return address;
    }
    public void setAddress(String address){
        this.address = address;
    }
    public Customer getCustomer(){
        return customer;
    }
    public void setCustomer(Customer customer){
        this.customer = customer;
    }
}

接下來再看看原本多對一的關係如何設定多的一方的外鍵為唯一 !!

Customer.hbm.xml

  
      
          
      
      
      
      
      
      

  


Address.hbm.xml

  
      
          
      
      

      
      
      
  


以上是一個 雙向"一對一"透過 多對一的改成的,如果是透過此法就記得必須將外鍵設為唯一

因為現在多的一方的外鍵只能關連到唯一一個 Address 了,

所以要在多的一方的組態檔中 的 many-to-one 設定 unique 屬性為 true

最後以一個 JSP 做 INSERT 資料的示範

// HTML 省略....
Customer c1 = new Customer();
c1.setName("Wallance");
Customer c2 = new Customer();
c2.setName("Q'Neal");


Address addr1 = new Address();
addr1.setAddress("BOS-1");
Address addr2 = new Address();
addr2.setAddress("BOS-2");


c1.setAddress(addr1);
c2.setAddress(addr2);


org.hibernate.SessionFactory sessionfactory = HibernateUtil.getSessionFactory();
org.hibernate.Session sess = sessionfactory.openSession();
org.hibernate.Transaction tx = sess.beginTransaction();


sess.save(c1); //save Customer !!
sess.save(c2);


tx.commit();
sess.close();
// HTML 省略....

沒有留言:

張貼留言