Hibernate之一对一外键关联

来源:互联网 发布:dwg文件格式java解析 编辑:程序博客网 时间:2024/06/09 22:10

(一)关系映射:是指对象之间的数量关系映射,并不是指数据库的关系。对于关系映射,需要思考数据库的表该如何映射。

(二)一对一单双向外键关联基于注解的方式

@Entitypublic class Customer implements Serializable {    @OneToOne(cascade = CascadeType.ALL)    @JoinColumn(name="passport_fk") //可以指定生成表中外键的名字(自己决定)    public Passport getPassport() {        ...    }@Entitypublic class Passport implements Serializable {    @OneToOne(mappedBy = "passport")//这种情况是在双向外键关联时,通过mappedBy来指定主从表    public Customer getOwner() {    ...}            

上面这个例子中,Customer 通过Customer 表中名为的passport_fk 外键列和 Passport关联. @JoinColumn注解定义了联接列(join column). 该注解和@Column注解有点类似, 但是多了一个名为referencedColumnName的参数. 该参数定义了所关联目标实体中的联接列. 注意,当referencedColumnName关联到非主键列的时候, 关联的目标类必须实现Serializable, 还要注意的是所映射的属性对应单个列(否则映射无效).

1、在一对一双向关联中, 有且仅有一端是作为主体(owner)端存在的:主体端负责维护联接列(即更新). 对于不需要维护这种关系的从表则通过mappedBy属性进行声明. mappedBy的值指向主体的关联属性. 在上面这个例子中,mappedBy的值为 passport. 最后,不必也不能再在被关联端(owned side)定义联接列了,因为已经在主体端进行了声明.

简而言之:在双向关联中,通过@OneToOne(mappedBy = "passport")来指定主从表

2、如果在主体没有声明@JoinColumn,系统自动进行处理: 在主表(owner table)中将创建联接列, 列名为:主体的关联属性名+下划线+被关联端的主键列名. 在上面这个例子中是passport_id, 因为Customer中关联属性名为passportPassport的主键是id.

(简而言之:如果没有指定@JoinColumn,则系统会自动起名


(三)一对一单双向外键关联基于xml的配置方式

1、a foreign key with a unique constraint, from Employee to Person, can be expressed as:(一对一单向外键关联)

<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
在Employee.hbm.xml中添加上面的标签即可

实例:在StuIdCard.hbm.xml中进行配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjsxt.hibernate.StuIdCard">
<id name="id">
<generator class="native"></generator>
</id>

<property name="num"/>
<many-to-one name="student" column="studentId" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

2、一对一双向外键关联

This association can be made bidirectional by adding the following to the Person mapping:

<one-to-one name="employee" class="Employee" property-ref="person"/>

Student.hbm.xml的配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" dynamic-update="true">
<id name="id">
<generator class="native"></generator>
</id>

<property name="name"></property>
<property name="age" />
<property name="sex" />
<property name="good" type="yes_no"></property>
<one-to-one name="stuIdCard" property-ref="student"></one-to-one>  //其中property-ref中的属性值是指StuIdCard类中getter方法后的值:getStudent
    </class>

</hibernate-mapping>

StuIdCard.hbm.xml的配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjsxt.hibernate.StuIdCard">
<id name="id">
<generator class="native"></generator>
</id>

<property name="num"/>
<many-to-one name="student" column="studentId" unique="true"></many-to-one>
    </class>

</hibernate-mapping>


(四)联合主键(一定要实现Serializable接口,重写equals()和hashCode()方法

package hibernate;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne;

@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}

public String getName() {
return name;
}
@OneToOne
@JoinColumns(
{
@JoinColumn(name="wifeId", referencedColumnName="id"),
@JoinColumn(name="wifeName", referencedColumnName="name")
}
)

public Wife getWife() {
return wife;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}


package hibernate;


import java.io.Serializable;

public class WifePK implements Serializable {
private int id;
private String name;


public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if(o instanceof WifePK) {
WifePK pk = (WifePK)o;
if(this.id == pk.getId() && this.name.equals(pk.getName())) {
return true;
}
}
return false;
}

@Override
public int hashCode() {
return this.name.hashCode();
}

}

package hibernate;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;


@Entity
@IdClass(WifePK.class)

public class Wife {
private int id;
private String name;
private int age;

public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}