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