Hibernate一对一主键关联(三)

一:深入浅出Hibernate里面一对一关联例子,一个人有一个护照

二:通过代码讲解一对一关系

1:在eclipse中新建JAVA PROJECT工程,引入hibernate-release-5.2.2.Final\lib\required下面所有包,还有Oracle驱动包,还有JUnit包

2:编写人和护照的model

package com.hibernate.model;

public class TUser {
	private String id;
	private String name;
	private int age;
	private TPassport passport;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public TPassport getPassport() {
		return passport;
	}
	public void setPassport(TPassport passport) {
		this.passport = passport;
	}

}

package com.hibernate.model;

public class TPassport {
	private String id;
	private String serial;
	private TUser user;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSerial() {
		return serial;
	}
	public void setSerial(String serial) {
		this.serial = serial;
	}
	public TUser getUser() {
		return user;
	}
	public void setUser(TUser user) {
		this.user = user;
	}

}
3:数据库表设计

-- Create table
create table T_USER
(
  id   VARCHAR2(32),
  name VARCHAR2(50),
  age  NUMBER
)

-- Create table
create table T_PASSPORT
(
  id     VARCHAR2(32),
  serial VARCHAR2(50)
)
4: 配置hibernate.cfg.xml文件

<?xml version='1.0' encoding='utf-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
<session-factory>  
    <!-- 数据库JDBC驱动 -->  
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <!-- 数据库URL --> 
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>  
    <!-- 数据库用户名  密码-->
    <property name="connection.username">mzzxzj0913</property>  
    <property name="connection.password">1</property>
    <!-- 数据库Dialect匹配平台特性 -->  
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>  
    <!-- 是否将运行期生成的SQL输出以供调试 -->
    <property name="show_sql">true</property>  
    <!-- 映射文件配置 -->
    <mapping resource="com/hibernate/xml/TUser.hbm.xml" />  
    <mapping resource="com/hibernate/xml/TPassport.hbm.xml" />          
</session-factory>  
</hibernate-configuration> 

5:配置 映射文件

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping>  
   <class name="com.hibernate.model.TUser" table="T_USER">  
   		<id name="id" column="id" type="string"></id>
   		<property name="name" column="name" type="java.lang.String"></property>
        <property name="age" column="age" type="java.lang.Integer"></property>
        <!-- cascade主控方执行save、update、delete的时候关联对象是否执行同一操作 -->
        <one-to-one name="passport" class="com.hibernate.model.TPassport" cascade="all" outer-join="true"></one-to-one>  
    </class>
</hibernate-mapping> 

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  
<hibernate-mapping>  
   <class name="com.hibernate.model.TPassport" table="T_PASSPORT">  
   		<id name="id" column="id" type="string">
   			<generator class="foreign">
   				<param name="property">user</param>
   			</generator>
   		</id>
   		<!-- constrained告诉hibernate当前主键存在约束 -->
   		<one-to-one name="user" class="com.hibernate.model.TUser" constrained="true"></one-to-one>
   		<property name="serial" column="serial" type="java.lang.String"></property>
    </class>
</hibernate-mapping> 

6:编写测试类,执行就会往表里插入数据,代码架构一样

package com.hibernate.model;


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

import junit.framework.TestCase;

public class HibernateTest extends TestCase{
	
	private Session session;

	/**
	 * TestCase初始化的时候会自动调用方法setUp
	 */
	@Override
	protected void setUp() throws Exception {
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		session = sessionFactory.openSession();
	}

	/**
	 * TestCase执行完毕时,会自动调用tearDown
	 */
	@Override
	protected void tearDown() throws Exception {
		session.close();
	}
	
	/**
	 * Junit会以test为前缀的方法作为测试方法
	 */
	public void testInsert(){
		TUser user = new TUser();
		user.setId("1");
		user.setName("xxh");
		user.setAge(10);
		
		TPassport passport = new TPassport();
		passport.setSerial("ceshi");
		
		passport.setUser(user);
		user.setPassport(passport);
		
		Transaction tx = session.beginTransaction();
		//因为cascade设置为all,所以会一同保存
		session.save(user);
		tx.commit();
				
	}
	
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值