这几天一直在郁闷hibernate中关于Map类型的一对多关系做映射的问题,参照Set的映射貌似可以存储,但是加载的时候就报错了!由于这几天一直呆在家里,用一个仅仅256kb/s的移动TD网卡上网(打开一个网页都要半个小时,而且是按照流量收费的),所以没有上网查,参照动力节点王勇老师讲的Set的映射方法和网上的方法,自己杜撰了一种方法(姑且称为桂式方法),弄了很长时间没弄好,所以只好放弃!今天回学校了,上网认真查了查,再在群里面问了问,总算是把问题基本上解决了!
参照过的觉得最有帮助的一篇文章出处是:http://esffor.iteye.com/blog/168253
有两个类:MapLayer和MapLayerField
package com.hgTIS.webgis.model;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* PointLayer generated by MyEclipse - Hibernate Tools
*/
public class MapLayer implements java.io.Serializable {
/**图层id**/
private Long id;
/**图层英文名称,动态图层与数据库标明一致,静态图层与图片名称一致**/
private String name;
/**图层中文名称**/
private String chName;
/**是否显示**/
private String display;
/**图层叠加次序**/
private Integer placeOrder;
/**最小比例等级**/
private String minScale;
/**最大比例等级**/
private String maxScale;
/**图层类型.point/layer/polygon**/
private String feaType;
/**图层类型:1动态;2静态;3空间查询;**/
private String type;
/**坐标系统**/
private String coordinateSystem;
/**父类图层ID;静态图层空间查询的时候使用**/
private MapLayer parentLayer;
/**必须用的字段**/
private Map<String,MapLayerField> displayFields =new LinkedHashMap<String, MapLayerField>(0);
/**分类显示的字段**/
private String sortField;
/**
geters and seters
**/
}
MapLayerField.java
package com.hgTIS.webgis.model;
/**
* 图层字段对象
*/
public class MapLayerField implements java.io.Serializable {
/**唯一标识**/
private Long id;
/**字段名称,一般与数据库字段一致**/
private String name;
/**中文名称**/
private String chName;
/**是否系统字段**/
private String systemField;
/**是否显示字段**/
private String viewField;
/**是否分类字段**/
private String sortField;
/**标题字段**/
private String titleField;
/**次序**/
private Integer forder;
private MapLayer mapLayer;
/**
geters and seters
**/
}
xml文件
MapLayer.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hgTIS.webgis.model.MapLayer" table="mapLayer" >
<id name="id" type="long">
<column name="id" />
<generator class="native"/>
</id>
<property name="name" column="name" not-null="true"/>
<property name="chName" column="chName"/>
<property name="display" column="display"/>
<property name="placeOrder" column="placeOrder"/>
<property name="minScale" column="minScale"/>
<property name="maxScale" column="maxScale"/>
<property name="feaType" column="feaType"/>
<property name="type" column="type"/>
<property name="coordinateSystem" column="coordinateSystem"/>
<many-to-one name="parentLayer" column="parentLayerId"/>
<property name="sortField" column="sortField"/>
<map name="displayFields" inverse="true" cascade="all">
<key column="layerid"/>
<map-key type="string" column="name"/><!-- 上面引用的那篇文章说index标签也可以-->
<one-to-many class="com.hgTIS.webgis.model.MapLayerField"/>
</map>
</class>
</hibernate-mapping>
MapLayerField.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.hgTIS.webgis.model.MapLayerField" table="mapLayerField" >
<id name="id" type="long">
<column name="id" />
<generator class="native" />
</id>
<property name="name" column="name" not-null="true"/>
<property name="chName" column="chName"/>
<property name="systemField" column="systemField"/>
<property name="viewField" column="viewField"/>
<property name="sortField" column="sortField"/>
<property name="titleField" column="titleField"/>
<property name="forder" column="forder"/>
<many-to-one name="mapLayer" column="layerid"/>
</class>
</hibernate-mapping>
主要是映射文件中的map标签中的map-key标签一定要与相应的类中的属性一致!
分享到:
相关推荐
其次,一对多映射通常用于表示一个实体可以拥有多个子实体的关系,如公司与员工。在Hibernate中,这可以通过`<one-to-many>`标签实现。在父类中,我们定义一个集合类型的属性,对应子类的主键作为外键。而在子类中,...
在Hibernate中,Set接口的实现类如HashSet和TreeSet通常用于一对多或多对多的关系映射。例如,一个用户可以有多个订单,订单也可以属于多个用户,这就形成了双向多对多关系。在映射文件中,我们通常使用`<set>`标签...
虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...
本教程主要聚焦于Hibernate中的一个复杂关系类型——双向多对多关系。 双向多对多关系是两个实体类之间的一种关联,每个实体都可以拥有多个实例,同时每个实例也可以关联到多个其他实体。这种关系在现实生活中很...
与一对多映射相似,只是关系的方向相反,多的一方使用`@ManyToOne`,少的一方不需要额外注解,因为通过外键关联已经可以实现。 4. **多对多映射** (Many-to-Many Mapping) 多个实体可以对应多个其他实体,如学生...
这在双向一对多或多对多关系中尤为重要,避免出现数据冗余或不一致。 3. **cascade**:这个属性定义了对集合中元素的操作应该如何传播。例如,如果设置为"save-update",那么当父对象被保存或更新时,子对象也会被...
在Hibernate中,集合映射主要用于表示一对多或多对多的关系。例如,一个用户可以有多个订单,这种关系就可以通过集合映射来实现。Hibernate提供了多种集合类型,如List、Set、Map等,它们分别对应于数据库中的数组、...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
在Hibernate的hbm.xml文件中,一对一关系通过标签,一对多关系通过、、<map>或标签来定义。需要详细指定实体类名、主键列名以及关联的外键列名。 2. 注解配置: 在实体类上直接使用@OneToOne、@OneToMany等注解进行...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...
关系的数据库表示可以分为一对一、一对多和多对多三种类型。例如,一个部门表和一个部门主管表之间是一对一关系,而一个部门表和下属人员表之间则是一对多关系。对象表示方面,对象关系分为单向和双向。双向关系意味...
- **7.5.1 一对多 (one to many)/多对一 (many to one)**:说明使用连接表的双向一对多/多对一关联映射。 - **7.5.2 一对一 (one to one)**:介绍使用连接表的双向一对一关联映射。 - **7.5.3 多对多 (many-to-...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2....
双向映射可以通过多对一、一对一、一对多关系来实现。 控件映射 Hibernate 的控件映射可以将一个对象的控件属性映射到数据库中。控件映射可以使用 Map 实现动态控件。 继承映射 Hibernate 的继承映射可以将一个...
组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be considered an exotic usage)。 Hibernate倾向于支持...
在关系数据库中,集合类型的数据(如Set、List、Map)不能直接存储,而Hibernate提供了将这些集合类型映射到数据库中的机制,如使用`Set`和`Map`映射关联关系,这使得Java对象的集合属性可以直接与数据库中的记录...
5. **双向关系**:在一对一、一对多、多对一、多对多关系中,都可以设置双向关系,即双方都能访问到对方。这需要在双方实体上都添加相应的注解,并确保关系的维护一致性。 6. **继承关系映射**:Hibernate支持类的...
在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...
21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 ...