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








 

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