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类的代码,源码侵入性较强。

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





  • 相关阅读:
    第七章补充 -- 关于文件目录的交互 OS
    第七章 -- 关于文件
    Python 函数声明和调用
    第三章 -- Python的基本数据类型
    关于tomcat控制台乱码
    UTF8MB4 是支持 表情符号的
    ngnix启动不了 解决办法
    关于jmeter 加载jar文件的疑问
    jmeter 使用 随机数据+md5加密注意事项
    jmeter 分布式注意事项
  • 原文地址:https://www.cnblogs.com/wenlong/p/4070096.html
Copyright © 2011-2022 走看看