本例模仿的是用户与身份证信息,即一个用户对应一个身份证信息,且用户的身份证信息不能重复,采取基于主键的映射配置策略,下面是具体实现代码:
1.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节点代表一个数据库 -->
<session-factory>
<!-- 1.数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib-demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2.其他相关配置 -->
<!--2.1显示hibernate在运行的时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2格式化sql
<property name="hibernate.format_sql">true</property>-->
<!-- 2.3自动建表 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- 3.加载所有映射
<mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>-->
</session-factory>
</hibernate-configuration>
2.User
package cn.itcast.c_one2one2;
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_one2one2;
public class IdCard {
private Integer user_id;
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
//身份证号主键
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_one2one2">
<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">
<hibernate-mapping package="cn.itcast.c_one2one2">
<class name="IdCard" table="t_IdCard">
<id name="user_id">
<!--
id 节点指定的是主键映射, 即user_id是主键
主键生成方式: foreign 即把别的表的主键作为当前表的主键;
property (关键字不能修改)指定引用的对象 对象的全名 cn..User、 对象映射 cn.User.hbm.xml、 table(id)
-->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="cardNum" length="20"></property>
<property name="place" length="20"></property>
<!--
一对一映射,有外键方
(基于主键的映射)
constrained="true" 指定在主键上添加外键约束
-->
<one-to-one name="user" class="User" constrained="true" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
6.Junit测试
package cn.itcast.c_one2one2;
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();
}
}