hibernate 映射多对多 包含其他字段属性

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" />


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值