Hibernate annotation 一對一關係共享主鍵配置

Hibernate annotation 一對一關係共享主鍵配置

作者 武漢科技大學 周劍華

引言

在這個例子中.分爲學生基本信息表(student_basic)和學生詳細信息表(student_detail).兩個表共享主鍵.利用hibernate annotation @one2one映射.爲了共享主鍵,需要用到hibernate@PrimaryKeyJoinColumn來完成.

 

數據庫schema

    第一.        數據庫的關係圖

      (該文章書寫時在word中完成.但是由於javaeye的編輯目前不支持圖片拷貝.暫時無法顯示該圖片.該圖片是一個ER圖.描述student_basic和student_detail的關係)

    第二.ddl語句 

 create table student_detail
(
   student_id           int not null,
   home_address         varchar(100),
   home_phome           varchar(13)
);

/*==============================================================*/
/* Table: studnet_basic                                         */
/*==============================================================*/
create table studnet_basic
(
   student_id           int not null,
   studnet_name         varchar(20),
   sex                  varchar(10),
   primary key (student_id)
);

alter table student_detail add constraint FK_R_Student_basic_detail foreign key (student_id)
      references studnet_basic (student_id) on delete restrict on update restrict;

實體類配置

第一. StudentBasic類配置

package org.jenfer.interview.ch07.entity;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

 

@Entity(name="StudentBasic")

@Table(name="student_basic")

public class StudentBasic implements Serializable{

         private static final long serialVersionUID = 691350277643811847L;

 

         @Id

         @GeneratedValue(strategy=GenerationType.IDENTITY)

         @Column(name="student_id")

         private Integer studentId;

        

         @Column(length=10)

         private String studentName;

        

         @Column(length=10)

         private String sex;

        

         public StudentBasic() {

         }

 

         public Integer getStudentId() {

                   return studentId;

         }

 

         public void setStudentId(Integer studentId) {

                   this.studentId = studentId;

         }

 

         public String getStudentName() {

                   return studentName;

         }

 

         public void setStudentName(String studentName) {

                   this.studentName = studentName;

         }

 

         public String getSex() {

                   return sex;

         }

 

         public void setSex(String sex) {

                   this.sex = sex;

         }

}

 

第二 . StudentDetail配置

package org.jenfer.interview.ch07.entity;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToOne;

import javax.persistence.PrimaryKeyJoinColumn;

import javax.persistence.Table;

 

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.annotations.Parameter;

 

@Entity(name="StudentDetail")

@Table(name="student_detail")

public class StudentDetail implements Serializable{

         private static final long serialVersionUID = 2038888147029653370L;

        

         @Id

         @Column(name="student_id")

         @GeneratedValue(generator="foreigner")

         @GenericGenerator(name="foreigner",strategy="foreign",parameters={

                            @Parameter(name = "property",value="studentBasic")

         })

         private Integer stuId;

        

         @OneToOne

         @PrimaryKeyJoinColumn

         private StudentBasic studentBasic;

        

         @Column(length=50)

         private String homeAddress;

        

         @Column(length=100)

         private String homePhomeNumber;

 

         public StudentDetail() {

         }

 

         public StudentBasic getStudentBasic() {

                   return studentBasic;

         }

 

         public void setStudentBasic(StudentBasic studentBasic) {

                   this.studentBasic = studentBasic;

         }

 

         public String getHomeAddress() {

                   return homeAddress;

         }

 

         public void setHomeAddress(String homeAddress) {

                   this.homeAddress = homeAddress;

         }

 

         public String getHomePhomeNumber() {

                   return homePhomeNumber;

         }

 

         public void setHomePhomeNumber(String homePhomeNumber) {

                   this.homePhomeNumber = homePhomeNumber;

         }

 

         public Integer getStuId() {

                   return stuId;

         }

 

         public void setStuId(Integer stuId) {

                   this.stuId = stuId;

         }

}

 

小結

         由於JPA沒有定義怎麼共享主鍵的方法.所以必須得藉助hibernate的屬性來設置.

@Id

         @Column(name="stu_id")

         @GeneratedValue(generator="foreigner")

         @GenericGenerator(name="foreigner",strategy="foreign",parameters={

                            @Parameter(name = "property",value="studentBasic")

         })

語句塊中, @Parameter(name = "property", value="studentBasic")屬性指出,從類StudentDetail的主鍵要共享studentBasic屬性的主鍵值.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章