Hibernate学习笔记之多表操作

来源:互联网 发布:java 反射 invoke 编辑:程序博客网 时间:2024/05/16 04:34


+  用户表user,创建课程属性表course、用户课程关系表user_course。
    user( id, name, password)
    course( course_id, course_name, course_desc)
    user_course( id, course_id), 其中id,course_id是外键
+  生成对应的对象:
    user: id, name, password, courses;course:id, name, desc, users
    其中的users和courses就是java.util.Set,里面包含的是各自指向的对象。
+ 在Hibernate映射文件中进行配置,现在foxgem.hbm.xml文件的内容变成:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
    <hibernate-mapping>
        <class name="foxgem.User" table="user">
            <id name="id" type="int" unsaved-value="null" >
                <column name="id" sql-type="int" not-null="true"/>
                <generator class="identity"/>
            </id>
            <property name="name">
                <column name="name" sql-type="varchar(10)" not-null="true"/>
            </property>
           <property name="password">
                <column name="password" sql-type="varchar(20)" not-null="true"/>
            </property>
           
            <!-- 多对多映射,其中表名为user、course的映射表 -->
            <set name="courses" table="user_course" lazy="true">
                <key>
                <!-- 列名为映射表中表示用户的列名 -->
                    <column name="user_id" not-null="true"/>
                </key>
                <!-- 类名为实际的java类 -->
                <many-to-many class="foxgem.Course">
                    <!-- 列名为映射表中表示课程的列名 -->
                    <column name="course_id" not-null="true"/>
                </many-to-many>
            </set>
        </class>
   
        <class name="foxgem.Course" table="course">
            <id name="id" type="int" unsaved-value="null" >
                <column name="course_id" sql-type="int" not-null="true"/>
                <generator class="identity"/>
            </id>
            <property name="name">
                <column name="course_name" sql-type="varchar(20)" not-null="true"/>
            </property>
            <property name="desc">
                <column name="course_desc" sql-type="varchar(20)" not-null="true"/>
            </property>
            <set name="users" table="user_course" lazy="true">
                <key>
                    <column name="course_id" not-null="true"/>
                </key>
                <many-to-many class="foxgem.User">
                    <column name="user_id" not-null="true"/>
                </many-to-many>
            </set>
        </class>
    </hibernate-mapping>

+ 对应的crud操作与单表非常类似,获取与user相关的course只需要获取对应的courses属性即可,设置也是一样。

在做例子时发现的问题
    在进行many to many的映射时,为了在页面间传递获取的集合而使用request.setAttribute需要注意。此时,
    不要直接将值赋入,而需要读取出来后在赋值。如:
    错误的用法:
    request.setAttribute( "userCourses", ur.getCourses(););

    正确的用法:
    Set userCourses= ur.getCourses();
    Iterator it= userCourses.iterator();
    HashSet uCourses= new HashSet();
    if( null!= it){
        while( it.hasNext()){
             uCourses.add( it.next());
         }
    }
    request.setAttribute( "userCourses", uCourses);
    否则Hibernate将抛出异常
    原因很简单,因为在进行映射时指定为lazy=true,所以不访问,就不会真正读取。

原创粉丝点击