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*;}

映射文件:


person.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">    <!-- 映射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" />


原创粉丝点击