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单向一对多关联映射(注解版)
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用...
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子
通过联接表处理单向一对多关联是首选方式,这种关联通过@JoinTable批注进行描述 @Entity Public class Trainer{ @OneToMany @JoinTable( name = "TrainedMonkeys", jonColumns = {@JoinColumn(name = "trainer_id...
* @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载 * 方法一 使用这种配置,在为“一端”添加“多...
建立对SQL语句的映射是Hibernate框架操作数据库的主要手段,这里我们列举实例来为大家讲解Java的Hibernate框架中一对多的单向和双向关联映射
12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多双向关联的annotation注解实现545 12.4.10 组成关系...
一对一(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. 映射二级表...
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. 双向关联...
这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....
一对一(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. 映射二级表...
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. 双向关联...
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. 双向关联...
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. 双向关联...
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. 双向关联...
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. 双向关联,...
一对一(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. 映射二级表...