Hibernate注解方式一對多自關聯關系映射


MySQL版數據庫表結構

 

 
DROP TABLE IF EXISTS SYS_DICT_ITEM;  
CREATE TABLE SYS_DICT_ITEM(  
    ITEM_CODE VARCHAR(100) NOT NULL,  
    ITEM_VALUE VARCHAR(200),  
    DICT_CODE VARCHAR(100) NOT NULL,  
    PARENT_CODE VARCHAR(100),  
    EDIT_TIME DATETIME,  
    ITEM_DESC VARCHAR(100),  
    SEQ INT(6),  
    STATUS CHAR(1),  
    PRIMARY KEY(DICT_CODE, ITEM_CODE)  
);  

 

其中,PARENT_CODE字段即表示SYS_DICT_ITEM表的ITEM_CODE字段

 


先來看看XML方式的Hibernate映射關系

JavaBean類如下,簡單起見,setter和getter方法省略了

 

public class DictItem extends StatefulBean {  
    private static final long serialVersionUID = -377812468484463777L;  
    private String code; // 字典項編碼  
    private String value; // 字典項值  
    private String dictCode; // 字典編碼  
    private String parentCode; // 父節點編碼  
    private Date editTime; // 修改時間  
    private String desc; // 描述  
    private Integer seq = 0; // 序號:0(默認值)  
    private Boolean status = Boolean.valueOf(true); // 可用狀態:true-啟用(默認值),false-停用  
    private Set<DictItem> children;  
} 

 

 

Hibernate的XML映射文件如下:

 

<class name="DictItem" table="SYS_DICT_ITEM">  
        <id name="code" type="java.lang.String">  
            <column name="item_code"></column>  
            <generator class="assigned"></generator>  
        </id>  
        <property name="value" type="java.lang.String">  
            <column name="item_value"></column>  
        </property>  
        <property name="dictCode" type="java.lang.String">  
            <column name="dict_code"></column>  
        </property>  
        <property name="parentCode" type="java.lang.String">  
            <column name="parent_code"></column>  
        </property>  
        <property name="editTime" type="java.util.Date">  
            <column name="edit_time"></column>  
        </property>  
        <property name="desc" type="java.lang.String">  
            <column name="item_desc"></column>  
        </property>  
        <property name="seq" type="java.lang.Integer">  
            <column name="seq"></column>  
        </property>  
        <property name="status" type="java.lang.Boolean">  
            <column name="status"></column>  
        </property>  
          
        <!-- DictItem:DictItem = 基於外鍵的單向1:n關聯-->  
        <set name="children" inverse="false" cascade="all" lazy="false" order-by="seq">  
            <key column="parent_code"/>  
            <one-to-many class="DictItem"/>  
        </set>  
    </class>  

 


換成注解方式的JavaBean代碼如下:

 

 

@Entity  
@Table(name="SYS_DICT_ITEM")  
public class DictItem extends StatefulBean {  
    private static final long serialVersionUID = -377812468484463777L;  
    @Id  
    @GenericGenerator(name = "idGenerator", strategy = "assigned")  
    @Column(name="ITEM_CODE")  
    private String code; // 字典項編碼  
      
    @Column(name="ITEM_VALUE")  
    private String value; // 字典項值  
      
    @Column(name="DICT_CODE")  
    private String dictCode; // 字典編碼  
      
    @Column(name="PARENT_CODE")  
    private String parentCode; //父項編碼  
      
    @Column(name="EDIT_TIME")  
    private Date editTime; // 修改時間  
      
    @Column(name="ITEM_DESC")  
    private String desc; // 描述  
  
    @Column(name="SEQ")  
    private Integer seq; // 序號  
      
    @Column(name="STATUS")  
    private Boolean status = Boolean.valueOf(true); // 可用狀態:true-啟用(默認值),false-停用  
      
    @OneToMany(targetEntity=DictItem.class, mappedBy="children", cascade=CascadeType.ALL, fetch = FetchType.EAGER)  
    @JoinColumn(name = "PARENT_CODE")  
    @OrderBy("seq")  
    private Set<DictItem> children;  
}  

 

 

這里也有一篇帖子是使用注解方式的,但是父對象類型是自定義的JavaBean,而不是簡單的Java類型

http://guobin6125.iteye.com/blog/1597937

 

由於系統中需要將查詢出來的JavaBean對象轉換成json字符串,使用json-lib,父對象如果類型使用自定義的JavaBean,即DictItem類本身,轉換成json字符串的時候就會報錯,提示轉換出現循環xxx,因此轉換一下思路,使用String簡單類型來保存關聯關系即可。

 

關於Hibernate使用XML還是注解來維護映射關系,各有好處吧。並且,Spring框架也對Hibernate注解方式提供了很好的兼容性支持。

雖然XML內容是多了點兒,但是一般情況情況下,咱們也不會一個字符一個字符重新手寫的,大部分都是拷貝過來修改的;而注解方式,雖然看起來簡單,但是需要熟悉其中各種關系的配置方式,並且需要直接修改JavaBean類的代碼,源碼侵入性較強。

因此,選用適合的方式即可。

 

轉自:http://www.cnblogs.com/wenlong/p/4070096.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM