日期:2014-05-16  浏览次数:20383 次

Hibernate一对多映射
在关联关系的映射中使用最多的就是一对多的关联,一对多的关联分为两种:单向一对多,双向一对多。
首先准备两张表:用户表(user)和用户组表(group)
create table'group'(
 'id' int(10) unsigned NOT NULL auto_increment,
 'name' varchar(45)NOT NULL,
 PRIMARY KEY('id')
)

create table 'user'(
 'id' int(10) unsigned NOT NULL auto_increment,
 'name' varchar(45) NOT NULL,
 'group_id' int(10) unsigned default NULL,
 PRIMARY KEY('id'),
 KEY `FK_users_1` (`group_id`),   
 CONSTRAINT `FK_users_1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`)  
)


1.单向一对多的情况:
Group类中有如下属性:
private Integer id;
private String name;
//set集合用于存一对多中的"多"的一方
private Set<User> Users = new HashSet<User>(0)


User类只需要有本身的属性即可:
private Integer id;
private String name;

重点:
Group.hbm.xml文件的配置如下:
<hibernate-mapping>  
    <class name="com.stream.model.Group" table="group" catalog="test">  
        <id name="id" type="java.lang.Integer">  
            <column name="id" />  
            <generator class="identity" />  
        </id>  
        <property name="name" type="java.lang.String">  
            <column name="name" length="45" not-null="true" />  
        </property>  
                <!-- 以下是单向一对多的配置信息-->  
        <set name="users" inverse="false" cascade="all">  
            <key>  
                <!-- 指定user表中引用外键的是哪一列-->  
                <column name="group_id"/>  
            </key>  
            <!--配置是与哪一个类之间的一对多 -->  
            <one-to-many class="com.stream.model.User" />  
        </set>  
    </class>  
</hibernate-mapping>

在该配置文件中,inverse可以使用默认false,或者显示指定false,如以上代码。这样就指定一对多之间的关系由group这个POJO来维护。在单项一对多关联中,这点很重要,cascade="all"指定级联之间的等级,它具有如下几种值:
all:所有情况下均进行关联操作
none:所有情况下均不进行关联操作。这个默认值。
save-update:在执行save、update/saveOrUpdate时进行关联操作
delete:在执行delete时进行关联操作。

user.hbm.xml文件的配置与User这个类一样,不需要包含如何关于关联关系的配置:
Xml代码
    <class name="com.stream.model.User" table="user" catalog="test">  
            <id name="id" type="java.lang.Integer">  
                <column name="id" />  
                <generator class="identity" />  
            </id>  
            <property name="name" type="java.lang.String">  
                <column name="name" length="45" not-null="true" />  
            </property>  
    </class>  

但这里有两点需要说明的是:
1.如果在Group.hbm.xml映射文件中设置了inverse=true,那么说明这个一对多的关联是由多的一方来维护。
2.如果Group.hbm.xml映射文件中设置inverse=false,或者不设置该属性,即表示由自身来维护这个关联关系。