hibernate中一对一映射配置详细解析(一)

   本例模仿用户与身份证相对应的关系,即一个用户对应一个身份证信息,且身份证信息不能重复,下面代码是实现基于外键的一对一映射

1.hibernate.cfg.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中  -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径) 
    auto-import 默认为true,在写HQL的时候自动导入包名
            如果指定为false,在写HQL的时候必须要写上类的全名-->
<hibernate-mapping package="cn.itcast.c_one2one">
	<class name="User" table="t_user">
	   <id name="userId">
	      <generator class="native"></generator>
	   </id>
	   <property name="userName" length="20"></property>
	   <one-to-one class="IdCard" name="idCard"></one-to-one>
	   
	</class>
	

</hibernate-mapping>

2.User

package cn.itcast.c_one2one;

public class User {
	private Integer userId;
	private String userName;
	//用户与身份证信息,一对一的关系
	private IdCard idCard;
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public IdCard getIdCard() {
		return idCard;
	}
	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
	
	

}

3.IdCard

package cn.itcast.c_one2one;

public class IdCard {
	//身份证号主键
	private String cardNum;
	private String place;//身份地址
	//身份证与用户关系,一对一的关系
	private User user;
	public String getCardNum() {
		return cardNum;
	}
	public void setCardNum(String cardNum) {
		this.cardNum = cardNum;
	}
	public String getPlace() {
		return place;
	}
	public void setPlace(String place) {
		this.place = place;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
	
	

}

4.User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中  -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径) 
    auto-import 默认为true,在写HQL的时候自动导入包名
            如果指定为false,在写HQL的时候必须要写上类的全名-->
<hibernate-mapping package="cn.itcast.c_one2one">
	<class name="User" table="t_user">
	   <id name="userId">
	      <generator class="native"></generator>
	   </id>
	   <property name="userName" length="20"></property>
	   <one-to-one class="IdCard" name="idCard"></one-to-one>
	   
	</class>
	

</hibernate-mapping>

5.IdCard.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中  -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径) 
    auto-import 默认为true,在写HQL的时候自动导入包名
            如果指定为false,在写HQL的时候必须要写上类的全名-->
<hibernate-mapping package="cn.itcast.c_one2one">
	<class name="IdCard" table="t_IdCard">
	   <id name="cardNum">
	      <generator class="assigned"></generator>
	   </id>
	   <property name="place" length="20"></property>
	   
	   <!--一对一映射,有外键方,unique="true" 给外键字段 添加唯一约束 -->
	  <many-to-one class="User" unique="true" name="user"
	  column="user_id" cascade="save-update"></many-to-one>
	   
	</class>
	

</hibernate-mapping>

6.Junit测试


package cn.itcast.c_one2one;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

public class App {
	private static SessionFactory sf;
	static{
		sf=new Configuration()
		.configure()
		.addClass(IdCard.class)
		.addClass(User.class)
		.buildSessionFactory();
	}
	@Test
	public void save(){
		Session session=sf.openSession();
		session.beginTransaction();
		//用户
		User user=new User();
		user.setUserName("liudehua");
		//身份证
		IdCard idCard=new IdCard();
		idCard.setCardNum("343567677");
		idCard.setPlace("成都");
		//关系
		idCard.setUser(user);
		//保存
		session.save(idCard);
		
		session.getTransaction().commit();
		session.close();
	}

}


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值