zoukankan      html  css  js  c++  java
  • 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类的代码,源码侵入性较强。

    因此,选用适合的方式即可。





  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/wenlong/p/4070096.html
Copyright © 2011-2022 走看看