1. 程式人生 > >從零打造在線網盤系統之Hibernate配置O/R映射

從零打造在線網盤系統之Hibernate配置O/R映射

ppi rate 3.0 intra err 系列 源碼 ron xml配置

歡迎瀏覽Java工程師SSH教程從零打造在線網盤系統系列教程,本系列教程將會使用SSH(Struts2+Spring+Hibernate)打造一個在線網盤系統,本系列教程是從零開始,所以會詳細以及著重地闡述SSH三個框架的基礎知識,第四部分將會進入項目實戰,如果您已經對SSH框架有所掌握,那麽可以直接瀏覽第四章,源碼均提供在GitHub/ssh-network-hard-disk上供大家參閱

本篇學習要求

  1. 主鍵映射
  2. 普通屬性映射
  3. 組件映射
  4. 一對一關聯映射
  5. 多對一單向關聯映射
  6. 多對一雙向關聯映射

主鍵映射

註解配置

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

XML配置

    <id name="id" column="id">
        <!-- 主鍵的生成策略 -->
        <generator class="identity"/>
    </id>

Hiberante主鍵生成策略 http://www.cnblogs.com/hoobey/p/5508992.html

普通屬性映射

註解配置

    @Basic
    @Column(nullable = true)
    private String username;

XML配置

   <!-- 配置其他的屬性 -->
   <property name="username" column="username"/>

組件映射

註解配置

組件類
    @Embeddable
    public class Name {
        ...
    }
組件屬性
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "firstName", column = @Column(name = "firstName"))
            @AttributeOverride(name = "lastName", column = @Column(name = "lastName"))
    })
    private Name name;

XML配置

    <component name="name" class="com.jimisun.domain.Name">
        <property name="first" column="first"/>
        <property name="last" column="last"/>
    <component>

一對一關聯映射

一對一小節完整示例源碼下載

XML配置(模擬商品和商品詳情)

商品hbm.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <!-- 配置類和表結構的映射 -->
    <class name="com.jimisun.domain.Product" table="products">
        <!-- 配置id
            見到name屬性,JavaBean的屬性
            見到column屬性,是表結構的字段
        -->
        <id name="id" column="id">
            <!-- 主鍵的生成策略 -->
            <generator class="increment"/>
        </id>

        <!-- 配置其他的屬性 -->
        <property name="name" column="name" type="java.lang.String"/>

        <one-to-one name="productDetail" class="com.jimisun.domain.ProductDetail" cascade="all"/>

    </class>

</hibernate-mapping>
商品詳情hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <!-- 配置類和表結構的映射 -->
    <class name="com.jimisun.domain.ProductDetail" table="product_details">
        <!-- 配置id
            見到name屬性,JavaBean的屬性
            見到column屬性,是表結構的字段
        -->
        <id name="id" column="id" type="int">

            <!-- 主鍵的生成策略 -->
            <generator class="foreign">
                <param name="property">product</param>
            </generator>
        </id>

        <!-- 配置其他的屬性 -->
        <property name="detatil" column="detatil"/>
        
        <one-to-one name="product" class="com.jimisun.domain.Product" constrained="true"/>
        
    </class>

</hibernate-mapping>

多對一單向關聯映射

多對一單向關聯映射完整示例源碼

我們看完了一對一映射我們可以看一下多對一的的映射,這些都是在實際的應用開發中經常用到的,這裏提到的單向映射就是單向映射關系,例多個訂單和用戶之間是多對一的映射關系,但是轉換為Java對象來進行表示的時候就是,訂單的對象中擁有其所屬的用戶對象,但是用戶對象中並沒有包含其擁有的訂單,這種單向的映射關系就是單向映射,下面示例是多個訂單和用戶的單向關聯關系表示

配置多的一方
<many-to-one name="customer" column="customer_id" class="com.jimisun.domain.Customer" cascade="all"/>
    public static void main(String[] args) {
        Session session = HibernateSessionFactory.getSession();
        Transaction transaction = session.beginTransaction();
        Customer customer = new Customer();
        customer.setName("bea");
        Order order = new Order();
        order.setNumber("1333");
        order.setCustomer(customer);
        session.save(order);
        transaction.commit();
        Integer id = order.getId();
        Transaction transaction1 = session.beginTransaction();
        Order order1 = session.get(Order.class, id);
        if (order != null) {
            System.out.println("Customer:" + order.getCustomer().getName());
            System.out.println("OrderNumber:" + order.getNumber());
        }
        transaction1.commit();
        session.close();
    }

多對一雙向關聯映射

多對一雙向關聯映射完整示例源碼

多對一的雙向關聯其實是和多對一單向關聯是相似的,我們只需要在一方(這裏是指用戶)對象中增加一個集合用來存儲其訂單

 private Set<Order> orders = new HashSet<>();

再在用戶對應的hbm.xml文件中對上述set集合進行配置

      <set name="orders" cascade="save-update,delete" order-by="order_number asc" lazy="true">
            <key column="customer_id"/>
            <one-to-many class="com.jimisun.domain.Order"/>
    </set>

本章總結

對象關系映射是Hibernate的核心,如何配置映射關系更是必會的技能,所以大家務必要掌握

從零打造在線網盤系統之Hibernate配置O/R映射