1. 程式人生 > >Hibernate一對一關聯對映(註解)

Hibernate一對一關聯對映(註解)

hibernate一對一關聯對映有兩種方式,一種是基於外來鍵方式(常用),一種是基於主鍵方式

一、首先我們來看基於外來鍵一對一關聯對映:

1.資料表關聯對映圖


基於外來鍵的一對一關聯對映,維護端(有外來鍵方)可以維護雙方關聯,對雙方進行刪除操作,而被維護端(無外來鍵方)則不可以

2.Customer實體類,維護端(有外來鍵方)

  1. @Entity
  2. @Table(name = "T_FOREIGN_CUSTOMER")  
  3. publicclass Customer {  
  4.     privateint id;  
  5.     private
     String name;  
  6.     private Referee referee;  
  7.     @Id
  8.     @GeneratedValue(strategy = GenerationType.TABLE, generator = "T_FOREIGN_CUSTOMER_GEN")  
  9.     @TableGenerator(name = "T_FOREIGN_CUSTOMER_GEN", table = "TB_GENERATOR", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VALUE", pkColumnValue = 
    "T_FOREIGN_CUSTOMER_GEN", allocationSize = 1)  
  10.     publicint getId() {  
  11.         return id;  
  12.     }  
  13.     publicvoid setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     publicvoid setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     /** 
  23.      * 預設外來鍵名referee_id 
  24.      * @OneToOne public Referee getReferee() { return referee; } 
  25.      * @return 
  26.      */
  27.     /** 
  28.      * /使用新的外來鍵名:referee1_id 
  29.      * @OneToOne 
  30.      * @JoinColumn(name="referee1_id") public Referee getReferee() { return 
  31.      * @return 
  32.      */
  33.     @OneToOne
  34.     @JoinColumn(name = "referee_id")  
  35.     // 維護端
  36.     public Referee getReferee() {  
  37.         return referee;  
  38.     }  
  39.     /** 
  40.      * 從上面的程式碼可以看出,getReferee方法使用了@OneToOne進設定 
  41.      * 在裝載Customer物件的同時,Referee物件會被同時裝載,而預設的外來鍵欄位就是Customer類中的referee屬性名+"_"+id 
  42.      * 也就是referee_id 
  43.      * @param referee 
  44.      */
  45.     publicvoid setReferee(Referee referee) {  
  46.         this.referee = referee;  
  47.     }  
  48. }  
 3.Referee實體類:被維護端(無外來鍵方)
  1. @Entity
  2. @Table(name="T_FOREIGN_REFEREE")  
  3. publicclass Referee {  
  4.     privateint id;  
  5.     private String name;  
  6.     private Customer customer;  
  7.     @Id
  8.     @GeneratedValue(strategy = GenerationType.TABLE, generator = "T_FOREIGN_REFEREE_GEN")  
  9.     @TableGenerator(name = "T_FOREIGN_REFEREE_GEN", table = "TB_GENERATOR", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VALUE", pkColumnValue = "T_FOREIGN_REFEREE_GEN", allocationSize = 1)  
  10.     publicint getId() {  
  11.         return id;  
  12.     }  
  13.     publicvoid setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     publicvoid setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     //mappedBy表示被維護端
  23.     @OneToOne(mappedBy="referee")  
  24.     public Customer getCustomer() {  
  25.         return customer;  
  26.     }  
  27.     publicvoid setCustomer(Customer customer) {  
  28.         this.customer = customer;  
  29.     }  
  30. }  
 4.CustomerService服務類:
  1. @Service("customerService")  
  2. @Transactional
  3. publicclass CustomerService {  
  4.     @Resource
  5.     private SessionFactory sessionFactory;  
  6.     publicvoid saveForgin() {  
  7.         Customer customer = new Customer();  
  8.         customer.setName("微軟");  
  9.         Referee referee = new Referee();  
  10.         referee.setName("趙軍");  
  11.         customer.setReferee(referee);  
  12.         referee.setCustomer(customer);  
  13.         // 先儲存無外來鍵方
  14.         sessionFactory.getCurrentSession().persist(referee);  //如果這裡不想一個物件一個物件儲存,想要級聯自動儲存,需要在儲存的物件那一方新增cascade=CascadeType.ALL來級聯儲存操作
  15.         sessionFactory.getCurrentSession().persist(customer);  
  16.     }  
  17.     public Customer getCustomer(int id) {  
  18.         return (Customer) sessionFactory.getCurrentSession().get(  
  19.                 Customer.class, id);  
  20.     }  
  21.     public Referee getReferee(int id) {  
  22.         return (Referee) sessionFactory.getCurrentSession().get(Referee.