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; } }
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; } }
<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>
@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
<!-- 被控方:指定stu屬性被IdClass中的pid屬性控制 --> <one-to-one name="stu" property-ref="pid"/>
//只要是雙向關聯就必定要指定mappedBy,將控制權交給指定的一方 @OneToOne(mappedBy="pid") private Student stu;
public class IdCardPK implements Serializable{ private static final long serialVersionUID = 1L; private String pid; private String bloodType; //血型 //******************* }
<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>
@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;
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; } }
<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>
//和組件關聯 @Embedded private IdClass pid;