在数据库中存在四种关联关系映射,分别为一对一(one-to-one),一对多(one-to-many),多对一(many-to-one),多对多(many-to-many),其中日常开发中比较常用的是一对多和多对一的映射,我们先来了解一下一对一的关系映射:
什么是一对一关系映射呢?就好比身份证和人之间的关系,一个人对应一张身份证,一张身份证对应一个人,这就是一对一的关系。接下来就通过实例来具体分析一下。首先需要建立数据库表,我们在数据库中要创建两张表,人员表Person和身份证表Card,结果如下,其中身份证表中使用外键与人员表的主键pid关联。
person表:
card表:
创建好数据库表之后,就可以进行编码了,要使用Hibernate,就需要配置hibernate.cfg.xml文件,在这里就不用多介绍了。然后就可以根据数据库表创建实体类,首先创建人员类Person,里面包含了人员的id,姓名,身份证对象信息:
package com.zking.entity;
public class Person {
private String pid;
private String pname;
private Card card;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", card=" + card + "]";
}
}
然后创建身份证表card,包含了身份证的id,身份证号,人员id以及人员对象信息:
package com.zking.entity;
import java.util.UUID;
public class Card {
private String pid;
//主键
private String cid = String.valueOf(UUID.randomUUID());
private String cno;
//主表的对象
private Person person;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCno() {
return cno;
}
public void setCno(String cno) {
this.cno = cno;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "Card [pid=" + pid + ", cid=" + cid + ", cno=" + cno + ", person=" + person + "]";
}
}
定义好实体类之后就可以创建映射文件了,Person.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">
<!-- Generated 2018-9-9 9:21:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Person" table="PERSON">
<id name="pid" type="java.lang.String">
<column name="PID" />
<generator class="guid" />
</id>
<property name="pname" type="java.lang.String">
<column name="PNAME" />
</property>
<!-- 1v1关系 -->
<one-to-one name="card" class="com.zking.entity.Card" cascade="delete"></one-to-one>
</class>
</hibernate-mapping>
注:cascade表示级联
接下来就需要配置Card.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">
<!-- Generated 2018-9-9 9:21:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Card" table="CARD">
<id name="pid" type="java.lang.String">
<column name="PID" />
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="cid" type="java.lang.String">
<column name="CID" />
</property>
<property name="cno" type="java.lang.String">
<column name="CNO" />
</property>
<!-- 1v1关系 -->
<one-to-one name="person" class="com.zking.entity.Person"></one-to-one>
</class>
</hibernate-mapping>
接下来只需要在hibernate.cfg.xml中添加映射就可以了。
<mapping resource="com/zking/entity/Card.hbm.xml"/>
<mapping resource="com/zking/entity/Person.hbm.xml"/>
然后我们进行测试,我们测试添加功能,写下面的代码:
package com.zking.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.zking.entity.Card;
import com.zking.entity.Person;
public class OneToOne {
@Test
public void OneAdd() {
Configuration configuration=new Configuration().configure();
SessionFactory sessionFactory=configuration.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
//创建对象
Person p=new Person();
p.setPname("李易峰");
//创建卡
Card c=new Card();
c.setCno("431023");
//互设(双向关系)
c.setPerson(p);
p.setCard(c);
//保存到session
session.save(p);
//提交
transaction.commit();
//关闭
session.close();
sessionFactory.close();
}
}
结果如下:
person表
card表: