一:深入浅出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();
}
}