Hibernate关联关系映射之一对一

在数据库中存在四种关联关系映射,分别为一对一(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表示级联

扫描二维码关注公众号,回复: 3239204 查看本文章

接下来就需要配置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表:

猜你喜欢

转载自blog.csdn.net/qq_42245219/article/details/82555476