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中关联属性名为passport, Passport的主键是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;
}
}
- Hibernate之一对一外键关联
- Hibernate关联关系之一对一(外键关联)
- Hibernate关联之一对一外键单向关联
- Hibernate关联之一对一外键双向关联
- hibernate 一对一外键关联
- (六)Hibernate之单向一对一外键关联映射
- hibernate之一对一 外键关联 left join
- Hibernate高级实体关联映射之单值的实体关联(一对一的外键关联)
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- Hibernate之一对一关联映射
- 13.Hibernate一对一外键&一对一主键双向关联
- Hibernate 一对一外键单向关联
- Hibernate 一对一外键双向关联
- Hibernate一对一关联(唯一外键)
- Hibernate 一对一外键单向关联
- hibernate一对一唯一外键关联
- Hibernate一对一单双向外键关联
- Hibernate 一对一外键单向关联
- Leetcode 131. Palindrome Partitioning
- Objective-C Runtime 运行时之四:Method Swizzling
- 1138:破解简单密码
- Jmeter响应的数据是unicode编码格式,怎么转成中文字符显示
- 京东笔试题生日礼物
- Hibernate之一对一外键关联
- Leetcode 67. Add Binary
- 文件名替换函数
- [Leetcode] 383. Ransom Note 解题报告
- ffmpeg中的时间
- Android开发笔记: 系统样式Android:theme-- 【图文并茂】
- 反转单链表
- org.apache.commons.dbutils 的API学习(1)
- git常用命令