Hibernate 学习之 多对多关联

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的配置就完成了,下面就是在系统中的应用了,大家应该都了解了。

记录以备查阅。

你可能感兴趣的:(Hibernate)