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,所以不访问,就不会真正读取。
- Hibernate学习笔记之多表操作
- Hibernate学习之多表查询
- Java学习笔记之多线程操作
- Hibernate之多对多表,操作实例
- hibernate多表操作之多对多
- Hibernate学习笔记7--关联关系之多对一
- Hibernate学习笔记10--关联关系之多对多
- hibernate之多对多映射操作中间表
- MySQL学习笔记之多表连接
- Hibernate学习笔记:级联操作
- Hibernate学习笔记:级联操作
- hibernate 学习笔记-操作数据库
- 学习笔记之多线程
- 学习笔记之多态
- Hibernate之多表查询
- hibernate学习之多对多
- Hibernate笔记三,表设计之多对多
- Hibernate 学习笔记(3):关联映射之多对一:@ManyToOne
- 怎么在struts中配置数据源
- 绿色的google 商店 google store
- 理解离散傅立叶变换(三.复数)
- 提高质量:不留小问题
- Willpower!
- Hibernate学习笔记之多表操作
- 作总结,但不做事后诸葛亮
- Oracle 数据库锁机制
- C6XX优化经验总结
- Study english everyday!
- 动态添加DevExpress 套件中 dxBar的菜单项目
- oracle 锁管理
- CCS中如何看程序运行的时钟周期
- 行列转置