好久没有写东西了,最近 几个项目都是在用mybatis 做,还是 发现 使用 hibernate 更 简单 高效,
关于 hibernate 的资料 ,网上很多 , 但是 没有 一些 总结 的很好的 资料,
通过一个实例,来讲解hibernate 的 , 可以 帮助 我们 彻底的搞清 hibernate 的 对象关系 映射。
首先 看我们的 ER 图 :涵盖了 一对一 ,一对多 ,多对多 的关系
一对一 在 hibernate 中的 实现 : 一个 用户user ,拥有 一张 身份证 id_card ; 一张 身份证 id_card 属于 一个 用户user
User.java 及 映射文件
import java.util.Date;
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1636556781734875928L;
private Long id;
private String username;
private String password;
private String state;
private Date createTime;
private IdCard idCard;
}
<?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="com.eliteams.quick4j.test.study.hibernate.example">
<class name="User" table="user">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="identity" />
</id>
<property name="username" type="string">
<column name="username" length="50">
</column>
</property>
<property name="password" type="string">
<column name="password" length="64">
</column>
</property>
<property name="state" type="string">
<column name="state" length="32">
</column>
</property>
<property name="createTime" type="timestamp">
<column name="create_time" length="19">
</column>
</property>
<one-to-one name="idCard" cascade="all">
</one-to-one>
</class>
</hibernate-mapping>
public class IdCard implements java.io.Serializable {
private static final long serialVersionUID = 4655357806608951570L;
private long id;
private String cardNo;
private User user;
}
<?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="com.eliteams.quick4j.test.study.hibernate.example">
<class name="IdCard" table="id_card">
<id name="id" type="long" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="cardNo" type="string">
<column name="card_no" length="36" />
</property>
<one-to-one name="user"></one-to-one>
</class>
</hibernate-mapping>
一对一 最佳实践:
user 是主表,id_card 是从表;
先有 user 用户 ,然后 才有 id_card 的;
所以 我们建表的 时候 user 的 主键 设为 自增 ;在映射 id_card 的 主键 的时候,标识它是 引用 user 表的 主键
我们通常在 主表中 设置 cascade 属性,来级联 操作 从表,保证数据的 正确性,减少 错误 冗余
以下是 删除 用户的操作,会 级联 删除 它 相对应的 身份证,可以看出 hibernate 是先删从表,然后再删除主表
@Test
public void test_delete() {
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
User user = (User) session.get(User.class, 5L);
session.delete(user);
transaction.commit();
}