【Hibernate】--一對一關聯、聯合主鍵

1、數據模型

            1.學生信息模型(編號、名稱、身份信息)

public class Student implements java.io.Serializable{

	private static final long serialVersionUID = 1L;

	private Integer sid;
	
	private String sname;
	
	private IdClass pid;
	
	public Integer getSid() {
		return sid;
	}

	public void setSid(Integer sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public IdClass getPid() {
		return pid;
	}

	public void setPid(IdClass pid) {
		this.pid = pid;
	}
}

 

2.身份信息模型(身份ID、省份)

public class IdClass implements java.io.Serializable{

	private static final long serialVersionUID = 1L;
	
	private String pid;
	
	private String provience;
	
	private Student stu;
	
	public String getPid() {
		return pid;
	}

	public void setPid(String pid) {
		this.pid = pid;
	}

	public String getProvience() {
		return provience;
	}

	public void setProvience(String provience) {
		this.provience = provience;
	}

	public Student getStu() {
		return stu;
	}

	public void setStu(Student stu) {
		this.stu = stu;
	}
}

2、單向惟一關聯

            A.配置文件描述

<hibernate-mapping package="com.hibernate.orm">
    <class name="Student" table="student">
        <id name="sid" type="java.lang.Integer" length="50">
            <generator class="identity"/>
        </id>
        <property name="sname" column="s_name" not-null="false" type="java.lang.String"/>
       
       <!-- 主控方:這裏雖然使用了many2one,可是設置了unique爲true,這樣就只能是單向一對一關聯了 -->
       <many-to-one name="pid" column="pid" cascade="all" unique="true"/>
    </class>
</hibernate-mapping>
<hibernate-mapping package="com.hibernate.orm">
    <class name="IdClass" table="id_class_info">
        <id name="pid" type="java.lang.String" length="20">
            <generator class="assigned"/>
        </id>
        <property name="provience" column="provience" not-null="false" type="java.lang.String"/>
        
        <!-- 被控方:指定stu屬性被IdClass中的pid屬性控制 -->
       	<one-to-one name="stu" property-ref="pid"/>
       	
    </class>
</hibernate-mapping>

            B.註解描述(在相關的屬性上添加註解描述)

@Entity
@Table(name="student",catalog="study")
public class Student implements java.io.Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer sid;
	
	@Column(name="s_name",nullable=false, length=11)
	private String sname;
	
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="pid", nullable=false, unique=true)
	private IdClass pid;
	
	//......getter和setter方法省略............
}
@Entity
@Table(name="id_class_info",catalog="study")
public class IdClass implements java.io.Serializable{

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(generator="pid")
	@GenericGenerator(name="pid",strategy="assigned")
	private String pid;
	
	@Column(name="provience", length=40, nullable=false)
	private String provience;
	
	//只要是雙向關聯就必定要指定mappedBy,將控制權交給指定的一方
	@OneToOne(mappedBy="pid")
	private Student stu;
	
	//......getter和setter方法省略............
}

             注:一對一關聯配置參見網友博客:http://blog.csdn.net/dreamcatchergo/article/details/13627709
html

3、雙向一對一外鍵關聯

                 單向的基礎上,添加另外一方爲被控方,經過one-to-one實現被控方描述

            A.配置文件描述

<!-- 被控方:指定stu屬性被IdClass中的pid屬性控制 -->
<one-to-one name="stu" property-ref="pid"/>

           B.註解描述

//只要是雙向關聯就必定要指定mappedBy,將控制權交給指定的一方
@OneToOne(mappedBy="pid")
private Student stu;

4、聯合主鍵

                添加主鍵類,在身份信息模型中添加血型,將身份ID和血型做爲聯合主鍵,代碼以下
public class IdCardPK implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	private String pid;
	
	private String bloodType; //血型

	//*******************

}

            A.配置文件描述

<hibernate-mapping package="com.hibernate.orm.ufk">
    <class name="IdClass" table="id_class_info">
        <!-- 聯合主鍵 -->
       	<composite-id name="idCardPK" class="com.hibernate.orm.ufk.IdCardPK">
       		<key-property name="pid" column="p_id" length="20" type="string"/>
       		<key-property name="bloodType" column="blood_type" length="10" type="string"/>
       		
       		<!-- 不能再指定 generator
       		<generator class="assigned"/>
       		-->
       	</composite-id>
       	
       	<property name="provience" column="provience" not-null="false" type="string"/>
    </class>
</hibernate-mapping>
            student方修改關聯配置,將原有的pid作以下修改:
<many-to-one name="pid" cascade="all">
	<column name="p_id" unique="true"/>
	<column name="blood_type"/>
</many-to-one>

           B.註解描述

               主鍵類配置以下,注意添加getter和setter方法:
@Embeddable
public class IdCardPK implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@Column(name="p_id",nullable=false, length=20)
	private String pid;
	
	@Column(name="blood_type",nullable=false)
	private String bloodType; //血型

}
               身份信息修改以下              
@EmbeddedId
private IdCardPK idCardPK;
       學生信息模型關聯身份信息配置:
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({
	@JoinColumn(name="p_id",referencedColumnName="p_id"),
	@JoinColumn(name="blood_type",referencedColumnName="blood_type")
})
private IdClass pid;

5、組件關聯(將POJO類中的屬性做爲添加到某實體類)

              定義一個組件類POJO,代碼以下:
public class IdClass{

	private String provience;
	
	private String bloodType;

	public String getProvience() {
		return provience;
	}

	public void setProvience(String provience) {
		this.provience = provience;
	}

	public String getBloodType() {
		return bloodType;
	}

	public void setBloodType(String bloodType) {
		this.bloodType = bloodType;
	}
}

              A.配置文件描述

                      將POJO中的屬性做爲student的屬性,配置以下:
<hibernate-mapping package="com.hibernate.orm.component">
    <class name="Student" table="student">
        <id name="sid" type="integer" length="50">
            <generator class="identity"/>
        </id>
        <property name="sname" column="s_name" not-null="false" type="string"/>
       
       <!-- 組件關聯配置 -->
       <component name="pid" class="IdClass">
       		<property name="provience" column="provience" length="20"/>
       		<property name="bloodType" column="blood_type" length="10"></property>
       </component>
    </class>
</hibernate-mapping>

             B.註解描述,經過Embedded關聯組件

//和組件關聯
@Embedded
private IdClass pid;
相關文章
相關標籤/搜索