hibernate中一对一映射举个例子就是个人(User)与身份证(IdCard)的关系。
1、创建实体类User.java
package cn.itcast.a;
public class User {
private int userId;
private String userName;
private IdCard idCard;
public int getUserId() {
return userId;
}
public void setUserId(int 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;
}
}
2、创建实体类IdCard.java
package cn.itcast.a;
public class IdCard {
private int userId;
private String cardNum;
private String palce;
private User user;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getPalce() {
return palce;
}
public void setPalce(String palce) {
this.palce = palce;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3、配置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">
<hibernate-mapping package="cn.itcast.a">
<!--name为实体类的名称 table为表名 -->
<class name="User" table="t_user">
<!-- 主键字段 -->
<!-- name为实体类中的属性名 -->
<id name="userId">
<!-- native为自增长 -->
<generator class="native"></generator>
</id>
<!-- 其他字段 -->
<property name="userName" length="20"></property>
<!-- 一对一映射,没有外键方 -->
<one-to-one name="idCard" class="IdCard"></one-to-one>
</class>
</hibernate-mapping>
4、配置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">
<hibernate-mapping package="cn.itcast.a">
<!--name为实体类的名称 table为表名 -->
<class name="IdCard" table="t_idCard">
<!-- 主键字段 -->
<!-- name为实体类中的属性名 -->
<id name="userId">
<!--
id 节点指定的是主键映射,即userId是主键
主键生成方式:foreign 即把别的表的主键最为当前表的主键:
property(关键字不能修改)指定引用的对象
-->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<!-- 其他字段 -->
<property name="cardNum" length="20"></property>
<property name="palce" length="20"></property>
<!--
一对一映射,有外键方(基于主键的映射)
constrained="true" 指定在主键上添加外键约束
-->
<one-to-one name="user" class="User" constrained="true" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
5、配置hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///employee</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 其他相关配置 -->
<!-- 显示hibernate在运行时执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载所有映射 -->
<mapping resource="cn/itcast/a/IdCard.hbm.xml"/>
<mapping resource="cn/itcast/a/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
6、创建测试类App.java
package cn.itcast.a;
import static org.junit.Assert.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App {
private static SessionFactory sf;
static{
sf=new Configuration().configure().buildSessionFactory();
}
@Test
public void test() {
Session session=sf.openSession();
session.beginTransaction();
User user = new User();
user.setUserName("张三");
IdCard idcard = new IdCard();
idcard.setCardNum("420113");
idcard.setPalce("武汉");
idcard.setUser(user);
session.save(user);
session.save(idcard);
session.getTransaction().commit();
session.close();
}
}
7、项目结构图为