欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate一对多映射

程序员文章站 2022-07-04 23:09:44
...
在关联关系的映射中使用最多的就是一对多的关联,一对多的关联分为两种:单向一对多,双向一对多。
首先准备两张表:用户表(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,或者不设置该属性,即表示由自身来维护这个关联关系。