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