在此情況中,我們可以看成 "多對一" 中,每個多的一方限制只能關連到唯一 一個 "一方"
這樣的情況下只要讓多的一方在資料表中的外鍵設定為唯一即可!!
以下舉一個 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 省略....
沒有留言:
張貼留言