hibernate 映射多对多 包含其他字段属性
来源:互联网 发布:淘宝流量币从哪进货的 编辑:程序博客网 时间:2024/06/07 06:21
Hibernate框架可以将面向关系的 数据库模型封装成面向对象的数据库模型,这样以来一方面了我们在具体应用中的数据库设计,另一方面又简化了我们的编码。然而在现实中我们往往会发现有些面 向关系的数据库模型转化成面向对象的数据库模型之后很难再Hibernate中 配置。比如:在多对多关系模型中,中间表往往含有自己的属性,这种情况在Hibernate中 该如何配置?我在网上查了好多资料都说将多对多拆成两个一对多的方式来解决,这样做也不错,不过我个人觉得使用起来比较麻烦,更主要的一点是这种方法将Hibernate面向对象的设计思想降低到了关系型设计,Hibernate带来的好处就只有编码方便这一点了。
sql:
create table person ( person_id integer, name varchar(15), age integer, constraint person_pk primary key(person_id) ); create table event ( event_id integer, title varchar(20), discrip varchar(50), constraint event_pk primary key(event_id) ); create table person_event ( person_id integer not null, event_id integer not null, test integer, constraint person_event_pk primary key(person_id,event_id), constraint person_event_fk1 foreign key(person_id) references person(person_id), constraint person_event_fk2 foreign key(event_id) references evnet(event_id) );/
结过表:
person(person_id,name,age);
event(event_id,title,discrip);
person_event(person_id,event_id,test);
映射到hibernate:
import java.util.*;public class Person{ private int person_id; private String name; private int age; private Map<Event,Integer> event=new Map<Event,Integer>(); //当联系属性有多个时,Integer 改为组件类,即一个复合属性 //set*,get*}import java.util.*;public class Event{ private int event_id; private String title; private Map<Person,Integer> person=new Map<Person,Integer>(); //set*,get*;}
映射文件:
<?xml version="1.0" encoding="GBK"?><!-- 指定Hibernate映射文件的根元素 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="lee"> <!-- 映射Person持久化类 --> <class name="Person" table="person"> <!-- 映射标识属性 --> <id name="id" column="person_id"> <!-- 指定identity的主键生成策略 --> <generator class="sequence"/> <!--oracle 支持 --> </id> <!-- 映射普通属性 --> <property name="name" type="string"/> <property name="age" type="int"/> <!-- 映射和MyEvent实体的关联关系 --> <map name="event" table="person_event"> <!-- 映射连接表中参照此表主键的外键列的列名 --> <key column="person_id"/> <!--外键event_id 参照表event ,多对多关联--> <map-key-many-to-many column="event_id" class="Event"></map-key-many-to-many> <!-- 联系属性 --> <element column="test" type="int"></element> </map> </class></hibernate-mapping>event.hbm.xml:
<?xml version="1.0" encoding="GBK"?><!-- 指定Hibernate映射文件的根元素 --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="lee"> <!-- 映射MyEvent持久化类 --> <class name="Event" table="event_table"> <!-- 映射标识属性 --> <id name="id" column="event_id"> <!-- 指定identity的主键生成策略 --> <generator class="sequence"/> </id> <!-- 映射普通属性 --> <property name="title" type="string"/> <property name="discrip" type="string"/> <!-- 映射和Person实体的关联关系 --> <map name="actors" table="person_event" inverse="true"> <!-- 映射连接表中参照此表记录的外键列的列名 --> <key column="event_id"/> <!-- 外键person_id参照主表person,多对多关联 --> <map-key-many-to-many column="person_id" class="Person"></map-key-many-to-many> <!--联系属性--> <element column="test" type="int"></element> </map> </class></hibernate-mapping>
或者拆开成两个一对多
Role实体public class Role implements Serializable { /*ID*/ private Long id; /*名称*/ private String name; /*与RoleResource的一对多关系*/ Private Set<RoleResource> roleResources= new HashSet<RoleResource>(); //get set}Resource实体public class Resource implements Serializable { /*ID*/ private Long id; /*名称*/ private String name; /*与RoleResource的一对多关系*/ private Set<RoleResource> roleResources = new HashSet<RoleResource>(); // getset}RoleResource辅助实体public class RoleResource implements Serializable{ /*ID*/ private Long id; /*与Role的多对一关系*/ private Role role; /*与Resource的多对一关系*/ private Resource resource; /*排序字段*/ private Integer sort; // getset}
Role.hbm.xml<hibernate-mappingpackage="com.glw.domain"> <class name="Role" table="glw_role"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" type="string" not-null="true"unique="true" length="50"/> <!--roleResource,与RoleResource的一对多关系--> <set name="roleResources" order-by="id ASC"inverse="true" lazy="false"> <key column="roleId"/> <one-to-many class="RoleResource" /> </set> </class></hibernate-mapping>Resource.hbm.xml<hibernate-mappingpackage="com.glw.domain"> <class name="Resource" table="glw_resource"> <id name="id" column="id"> <generator class="native" /> </id> <property name="name" type="string" not-null="true"length="50"/> <!--roleResources,与RoleResource的一对多关系--> <set name="roleResources" order-by="id ASC"inverse="true" lazy="false"> <key column="resourceId"/> <one-to-many class="RoleResource"/> </set> </class></hibernate-mapping>RoleResource.hbm.xml<hibernate-mappingpackage="com.glw.domain"> <class name="RoleResource" table="glw_role_resource"> <id name="id" column="id"> <generator class="native" /> </id> <property name="sort" type="integer" not-null="true" /> <!--role,与Role的多对一关系--> <many-to-one name="role" class="Role" column="roleId" /> <!--resource,与Resource的多对一关系--> <many-to-one name="resource" class="Resource"column="resourceId"/> </class></hibernate-mapping>Hibernate.cfg.xml中配置<mapping resource="com/glw/domain/Role.hbm.xml"/><mapping resource="com/glw/domain/Resource.hbm.xml" /><mapping resource="com/glw/domain/RoleResource.hbm.xml" />
- hibernate 映射多对多 包含其他字段属性
- Hibernate 多对多中间表 有其他字段映射
- Hibernate多对多中间关系表有属性(其他字段)的配制方法
- Hibernate中将一个字段映射到POJO多个属性
- Hibernate中将一个字段映射到POJO多个属性
- Hibernate关联映射--多对一映射
- hibernate 多对多映射
- Hibernate多对多映射
- hibernate多对多映射
- Hibernate多对多映射
- Hibernate多对多映射
- hibernate多对多映射
- 多对多 hibernate映射
- Hibernate多对多映射
- Hibernate---多对多映射
- Hibernate多对多映射
- Hibernate 多对多映射
- 【Hibernate】多对多映射
- google发布紧急通知!!情况严重!!!
- 图片链接滚动效果
- C++ 多线程编程总结
- VC6.0 利用ADO连接Sqlserver2005数据库方法
- 业界首款ARM v8架构64bit微服务器曝光
- hibernate 映射多对多 包含其他字段属性
- 由于TSM引起的数据库宕机
- js网页全屏及禁止特殊按键防止页面刷新与前进后退(改进版)
- Maven_Maven的多模块(Multi-Module)工程的pom编写
- linux 域名转ip
- uboot系列之----Uboot配置过程详细分析
- 面向对象_03_多态
- 二叉搜索树
- 《锋利的jQuery》读书笔记 第3章 jQuery中的DOM操作