Hibernate关系映射:一对一关联(示例)

Hibernate关系映射:一对一关联

对于基于外键的1-1关联,外键可以存放在任意一边。需要存放外键的一端,需要增加<many-to-one.../>元素,并且为<many-to-one.../>元素增加unique="true"属性来表示该实体实际上是1的一端。<many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>

对于1-1的关联关系,两个实体原本处于平等状态,但当我们选择任意一个表来增加外键后(增加<many-to-one.../>元素的实体端),该表即变成从表,而另一个表则成为主表。

另一端需要使用<one-to-one.../>元素,该<one-to-one.../>元素需要使用name属性指定关联属性名。为了让系统不再为本表增加一列,而是使用外键关联,使用property-ref属性指定引用关联类的属性。<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>

案例:

卡号实体类:

package com.liuyongqi.MavenHibernateDemo04.entity;

import java.io.Serializable;
/**
 * 卡号实体类
 * @author Administrator
 * @data   2018年8月6日
 * @time   上午11:51:34
 */
public class Card implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -3229041685479626246L;
	private Integer pid;					//卡号编号
	private String cname;					//卡号名称
	private Person person;					//个人对象
	
	public Card() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Card(String cname, Integer pid) {
		super();
		this.cname = cname;
		this.pid = pid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}	
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	@Override
	public String toString() {
		return "Card [pid=" + pid + ", cname=" + cname + ", person=" + person + "]";
	}
	
	
}	

个人实体类:

package com.liuyongqi.MavenHibernateDemo04.entity;

import java.io.Serializable;
/**
 * 个人实体类
 * @author Administrator
 * @data   2018年8月6日
 * @time   上午11:49:17
 */
public class Person implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -2013313014914594043L;
	private Integer pid;				//个人编号
	private String pname;				//个人名称
	private Card card;					//卡号对象
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(String pname) {
		super();
		this.pname = pname;
	}
	public Person(Integer pid, String pname) {
		super();
		this.pid = pid;
		this.pname = pname;
	}
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer 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.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-8-6 14:27:18 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.liuyongqi.MavenHibernateDemo04.entity.Card" table="card">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="foreign">
            	<param name="property">person</param>
            </generator>
        </id>
        <property name="cname" type="java.lang.String">
            <column name="cname" />
        </property>
        <one-to-one name="person" class="com.liuyongqi.MavenHibernateDemo04.entity.Person"></one-to-one>
    </class>
</hibernate-mapping>

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-8-6 14:27:18 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.liuyongqi.MavenHibernateDemo04.entity.Person" table="person">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="native" />
        </id>
        <property name="pname" type="java.lang.String">
            <column name="pname" />
        </property>
        <one-to-one name="card" class="com.liuyongqi.MavenHibernateDemo04.entity.Card" cascade="all-delete-orphan"></one-to-one>
    </class>
</hibernate-mapping>

SessionFactoryUtil工具类:

package com.liuyongqi.MavenHibernateDemo04.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 提供了开启和关闭session的方法
 * @author Administrator
 * @data   2018年8月1日
 * @time   下午3:32:56
 */
public class SessionFactoryUtil {
	//ThreadLocal为每个线程提供一个单独的存储空间
	private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
	
	//私有化静态变量,静态变量只实例化一次
	private static SessionFactory sessionFactory;
	//实例化一次sessionFactory
	static {
		Configuration configure = new Configuration().configure();
		sessionFactory=configure.buildSessionFactory();
	}
	//私有化构造方法
	private SessionFactoryUtil() {
		
	}
	//打开session的方法
	public static Session openSession() {
		//从ThreadLocal中拿取一个session
		Session session = threadLocal.get();
		if(null==session) {
			//sessionFactory打开一个session
			session=sessionFactory.openSession();
			//把session又放入ThreadLocal中
			threadLocal.set(session);
		}
		return session;
	}
	
	//关闭资源
	public static void closeSession() {
		//从ThreadLocal中拿取一个session
		Session session = threadLocal.get();
		if(null==session) {
			if(session.isOpen()) {
				//关闭session
				session.close();
			}
			threadLocal.set(null);
		}		
	}
	
	public static void main(String[] args) {
		Session session = openSession();
		System.out.println(session);
		System.out.println("ok");
	}
	
}

添加的测试代码:

package test;
/**
 * 测试类
 * @author Administrator
 * @data   2018年8月6日
 * @time   下午2:24:31
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo04.entity.Card;
import com.liuyongqi.MavenHibernateDemo04.entity.Person;
import com.liuyongqi.MavenHibernateDemo04.util.SessionFactoryUtil;

public class TestSave {
	public static void main(String[] args) {
		Session session = SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();
		Person person = new Person();
		person.setPname("张三");
		Card card = new Card();
		card.setCname("张三的卡号");
		//互设		
		card.setPerson(person);
		person.setCard(card);
		//先添加主表,在添加从表
		/*session.save(person);
		session.save(card);*/
		
		//级联添加(加配置)
		session.save(person);
		
		transaction.commit();
		SessionFactoryUtil.closeSession();		
		
	}

}

控制台结果:

Hibernate: 
		    insert 
		    into
		        person
		        (pname) 
		    values
		        (?)
		Hibernate: 
		    insert 
		    into
		        card
		        (cname, pid) 
		    values
		        (?, ?)*/

查询的测试代码:

package test;
/**
 * 测试类
 * @author Administrator
 * @data   2018年8月6日
 * @time   下午2:24:31
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo04.entity.Card;
import com.liuyongqi.MavenHibernateDemo04.entity.Person;
import com.liuyongqi.MavenHibernateDemo04.util.SessionFactoryUtil;

public class TestSelect {
	public static void main(String[] args) {
		Session session = SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();		
		Person person = session.get(Person.class, 1);
		System.out.println("aaa");
		System.out.println(person);
		transaction.commit();
		SessionFactoryUtil.closeSession();
	}

}

控制台结果:

Hibernate: 
		    select
		        person0_.pid as pid1_1_0_,
		        person0_.pname as pname2_1_0_,
		        card1_.pid as pid1_0_1_,
		        card1_.cname as cname2_0_1_ 
		    from
		        person person0_ 
		    left outer join
		        card card1_ 
		            on person0_.pid=card1_.pid 
		    where
		        person0_.pid=?
		aaa
		Person [pid=1, pname=王五]*

修改的测试代码:

package test;
/**
 * 测试类
 * @author Administrator
 * @data   2018年8月6日
 * @time   下午2:24:31
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo04.entity.Card;
import com.liuyongqi.MavenHibernateDemo04.entity.Person;
import com.liuyongqi.MavenHibernateDemo04.util.SessionFactoryUtil;

public class TestUpdate {
	public static void main(String[] args) {
		Session session = SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();
		//通过人来修改卡号
		/*Person person = session.get(Person.class, 1);
		if(person!=null) {
			person.getCard().setCname("王五的卡号");
			session.update(person);
		}*/
		//结果
		/*Hibernate: 
		    select
		        person0_.pid as pid1_1_0_,
		        person0_.pname as pname2_1_0_,
		        card1_.pid as pid1_0_1_,
		        card1_.cname as cname2_0_1_ 
		    from
		        person person0_ 
		    left outer join
		        card card1_ 
		            on person0_.pid=card1_.pid 
		    where
		        person0_.pid=?
		Hibernate: 
		    update
		        card 
		    set
		        cname=? 
		    where
		        pid=?*/
		//通过卡号来修改人
		Card card = session.get(Card.class,1);
		if(card!=null) {
			card.getPerson().setPname("王五");
			session.update(card);
		}
		transaction.commit();
		SessionFactoryUtil.closeSession();
	}

}

控制台控制台结果:

Hibernate: 
		    select
		        person0_.pid as pid1_1_0_,
		        person0_.pname as pname2_1_0_,
		        card1_.pid as pid1_0_1_,
		        card1_.cname as cname2_0_1_ 
		    from
		        person person0_ 
		    left outer join
		        card card1_ 
		            on person0_.pid=card1_.pid 
		    where
		        person0_.pid=?
		Hibernate: 
		    update
		        card 
		    set
		        cname=? 
		    where
		        pid=?

删除的测试代码:

package test;
/**
 * 测试类
 * @author Administrator
 * @data   2018年8月6日
 * @time   下午2:24:31
 */

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo04.entity.Card;
import com.liuyongqi.MavenHibernateDemo04.entity.Person;
import com.liuyongqi.MavenHibernateDemo04.util.SessionFactoryUtil;

public class TestDelete {
	public static void main(String[] args) {
		Session session = SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();
		//级联删(修改配置文件)
		Person person = session.get(Person.class, 2);
		if(person!=null) {
			session.delete(person);
		}

		transaction.commit();
		SessionFactoryUtil.closeSession();
	}

}

控制台结果:

Hibernate: 
		    select
		        person0_.pid as pid1_1_0_,
		        person0_.pname as pname2_1_0_,
		        card1_.pid as pid1_0_1_,
		        card1_.cname as cname2_0_1_ 
		    from
		        person person0_ 
		    left outer join
		        card card1_ 
		            on person0_.pid=card1_.pid 
		    where
		        person0_.pid=?
		Hibernate: 
		    delete 
		    from
		        card 
		    where
		        pid=?
		Hibernate: 
		    delete 
		    from
		        person 
		    where
		        pid=?

今天的测试

如果大家想浏览我的下一篇文章,请留言

此文章属于原创,不准转载:https://blog.csdn.net/LYQ2332826438

猜你喜欢

转载自blog.csdn.net/LYQ2332826438/article/details/81460631