Hibernate的关联关系看上去非常的头疼,不静下心来好好理理还是搞不清楚他到底什么什么玩意的。
背景:用户和权限(Function)之间的关系是多对多的关系,即一个一个用户可以有多个Function,而一个function也可以被多个用户所有。
问题:如何是用Hibernate来方便的维护二者之间的关系?
表建立:
FUNCTION表用来存储所有的function:
CREATE TABLE "MYTRX"."FUNCTION"
(
ID NUMBER NOT NULL,
FUNC_NAME varchar2(20) NOT NULL,
CONSTRAINT FUNCTION_PK primary key (ID)
);
USER_INFO表用来存储所有的user信息:
CREATE TABLE "MYTRX"."USER_INFO"
(
ID NUMBER NOT NULL,
USER_NAME varchar2(20) NOT NULL,
CONSTRAINT USER_INFO_PK primary key (ID)
);
我们还需要一个关系表USER_FUNCTION来存储两者的关系:
CREATE TABLE "MYTRX"."USER_FUNCTION"
(
USER_ID NUMBER NOT NULL,//这里应该是外键
FUNC_ID NUMBER NOT NULL,//这里应该是外键
CONSTRAINT USER_FUNCTION_PK primary key (USER_ID, FUNC_ID)
)
其实只要Hibernate中主外键的关系设好了,DB层的主外键关系就无所谓了,因为事物关系通过Hibernate实现了。
ORM就是简单的属性构造器,我就不列举了。必须要注意的是在Function的ORM中必须要有一个private Set user=new HashSet();属性用来存储当前function被哪些user拥有,同样在User Info的ORM中必须要有一个private Set function=new HashSet();属性用来存储当前的user拥有哪些function。
看配置文件:
<?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">
<hibernate-mapping>
<class name="com.mmif.ORM.MMIFAdmin" table="USER_INFO" catalog="MYTRX">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="sequence" >
<param name="sequence">S_USER_INFO_ID</param>
</generator>
</id>
<property name="userName" type="java.lang.String">
<column name="USER_NAME" length="20" />
</property>
<set name="function"
table="USER_FUNCTION"
lazy="false"
cascade="all">
<key column="USER_ID" not-null="true"/>
<many-to-many column="FUNC_ID"
class="com.mmif.ORM.MMIFFunction"/>
</set>
</class>
</hibernate-mapping>
注意set中个各个属性:
name是ORM中的属性名
table是关系表名,是DB中真实的表名,使用时需要直接用它拼SQL语句的
lazy表示是否延迟加载,理解成如果选true,系统在加载hibernate的时候就把本配置文件中表示的两者关系加载了,相应的SQL语句已经执行了。如果选false,系统只会在调用当前配置文件中的两者关系是才会执行相应的SQL查询数据等。
cascade就是表示级联操作的等级,是all或者update或者delete,不列举了
key表示当前表在关系表中的外键名称,可以是多个。必须是DB中真实的名称
many-to-many表示多对多的关系类型
column表示加载项在关系表中的外键名称,必须是DB中真实的名称
class表示加载项的ORM
<?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">
<hibernate-mapping>
<class name="com.mmif.ORM.MMIFFunction" table="FUNCTION" catalog="MYTRX">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="sequence" >
<param name="sequence">S_FUNCTION_ID</param>
</generator>
</id>
<property name="funcName" type="java.lang.String">
<column name="FUNC_NAME" length="20" />
</property>
<set name="user"
inverse="true"
lazy="false"
table="USER_FUNCTION">
<key column="FUNC_ID"/>
<many-to-many column="USER_ID"
class="com.mmif.ORM.MMIFAdmin"/>
</set>
</class>
</hibernate-mapping>
这里多了一个属性 inverse="true",表示是谁触发更新的意思。
自此hibernate的配置就完成了,下面就是在系统中的应用了,大家应该都了解了。
记录以备查阅。