`
wenlongsust
  • 浏览: 65606 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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

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





分享到:
评论

相关推荐

    Hibernate双向一对一关联映射(注解版)

    Hibernate双向一对一关联映射(注解版)

    hibernate双向一对多关联映射(注解版)

    hibernate双向一对多关联映射(注解版)

    hibernate单向一对多关联映射(注解版)

    hibernate单向一对多关联映射(注解版)

    Hibernate一对多关联映射(注解)

    NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079

    Hibernate1对多1对1多对多关联映射例子源码含注解配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...

    Hibernate1对多1对1多对多关联映射例子源码含xml配置

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子

    Hibernate_Annotation关联映射

    通过联接表处理单向一对多关联是首选方式,这种关联通过@JoinTable批注进行描述 @Entity Public class Trainer{ @OneToMany @JoinTable( name = "TrainedMonkeys", jonColumns = {@JoinColumn(name = "trainer_id...

    Hibernate注解

    * @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载 * 方法一 使用这种配置,在为“一端”添加“多...

    Java的Hibernate框架中一对多的单向和双向关联映射

    建立对SQL语句的映射是Hibernate框架操作数据库的主要手段,这里我们列举实例来为大家讲解Java的Hibernate框架中一对多的单向和双向关联映射

    精通Java Web整合开发(第2版)

    12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多双向关联的annotation注解实现545 12.4.10 组成关系...

    Hibernate Annotations 中文文档

    一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    hibernate annotation 中文文档

    一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...

    Hibernate+中文文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...

    HibernateAPI中文版.chm

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...

    hibernate3.2中文文档(chm格式)

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...

    Hibernate中文详细学习文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联...

    Hibernate 中文 html 帮助文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,...

    hibernate annotation帮助文档

    一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5.3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表...

Global site tag (gtag.js) - Google Analytics