好久沒有寫東西了,最近 幾個項目都是在用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();
}