hibernate 一對一 最佳實踐

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


IdCard.java 及 映射文件

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();
    }








 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章