07年7月26日
关于hibenrate,两年前的开发中用到过,没想到再用hibernate开发是两年后的今天,这阵子用hibernate开发
把以前没有用到的地方全用了,认识也深入了。
那么,这阵子的开发应该做个总结了,从一些基础的知识开始总结,比看书快。
来说一个基础全面的表关系
student表
stuId(主键)
classId
fileId
class表
classId(主键)
lesson表
lesId(主键)
file表(档案表)
fileId(主键)
stu2les表(学生和课程的关联表)
id(主键)
stuId
lesId
恩。。。这些就足够了,来说说表之间的关系:
学生表和档案表是一对一的关系(每个学生只能有一个档案,一个档案只能对应一个学生)
学生表和班级表是多对一的关系(一个班级可以有多个学生,每个学生只属于一个班级)
所以,班级表和学生表就是一对多的关系了,哈哈哈哈(为了把多对一关系记录下来,学生和班级做个双向关联)
学生表和课程表是多对多的关系(每个学生有多门功课,一门功课可以属于多个学生)
学生表和课程表是多对多,所以做了一张stu2les表(学生和课程的关联表),因为多对多配置
和在程序里的实现不是太可取,用的不是很多,所以这样来搞吧,多对多我也会做总结
学生表和关联表之间一对多
课程和关联表之间是一对多
关于O/R映射:
(1)一对一映射(学生表和档案表)
有两种情况:
一种是这两张表共享一个主键,即stuId,但是上面这个例子中显然不是共享主键这种情况
另有一种是这两张表外键关联的,上面的例子是外键关联的这种情况
看看PO和配置文件
Student.java
public class Student implements java.io.Serializable
{
private Integer stuId; //学生主键
private Class class; //班级对象
private File file; //档案对象
private Set stu2lesSet = new HashSet();
生成getter/setter方法
}
看映射关系通过这个类就可以看出来,学生和档案是一对一,所以档案在学生类里只定义对象
学生和班级是多对一关系,这个“一”对应的就是班级对象了
学生和关联表的关系是一对多,这个“多”对应的就是关联表的Set集合了
再看看Student.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.po.Student" table="Student" schema="dbo" catalog="Mytest">
<id name="stuId" type="integer">
<column name="stuId" />
<generator class="native" />
</id>
<property name="stuName" type="string">
<column name="stuName" length="50" />
</property>
<one-to-one
name="file"
class="com.hibernate.po.File" />
<many-to-one
name="class"
class="com.hibernate.po.Class"
column="classId"/> <!--这里体现出学生和班级的关系是多对一,通过学生表里的classId字段关联的-->
<set name="stu2lesSet" table="Stu2les" cascade="save-update" inverse="true" lazy="true">
<key column="stuId" />
<one-to-many class="com.hibernate.po.Stu2les" />
</set>
</class>
</hibernate-mapping>
上面这个配置文件中蓝色的代码很有必要说一下了,当我开发的时候,服务器上有两个数据库,这两个库的内容完全一样,一个叫Mytest,另一个叫Mytestpub这样两个库,当我的数据库连接从Mytest变成Mytestpub库的时候,发现连的还是Mytest数据库,查了一下,原来就是上面配置文件中蓝色代码搞的鬼,当把上面的蓝色代码去掉,就好了.蓝色的代码指定了配置文件必须和蓝色代码里规定的数据库连接,无论连接怎么变,它都会去找你指定的数据库里相应的表.
Class.java
public class Class implements java.io.Serializable
{
private Integer classId;
private String className;
private Set studentSet = new HashSet(); //学生集合
生成getter/setter方法
}
因为班级和学生是一对多,这个“多”就是学生的集合了
再看看配置文件
Class.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.po.Class" table="Class" >
<id name="classId" type="integer">
<column name="classId" />
<generator class="native" />
</id>
<property name="className" type="string">
<column name="className" length="50" />
</property>
<set name="studentSet" table="Student" cascade="save-update" inverse="true" lazy="true">
<key column="classId" />
<one-to-many class="com.hibernate.po.Student" />
</set>
</class>
</hibernate-mapping>
<key column="" />总是和本身类的主键id对应
<column="" />总是和关联类的主键id对应
说说inverse="true" 这个属性,一般出现在双向关联里
出现位置是在Set标签里,以它所在的配置文件为主表,而不是以它所在的Set标签里对应的那个表为主表
File.java
public class Class implements java.io.Serializable
{
private Integer fileId; //档案Id
private String fileName; //档案名称
private Student student; //学生对象
生成getter/setter方法
}
再来看看配置文件
File.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.po.File" table="File" >
<id name="fileId" type="integer">
<column name="fileId" />
<generator class="native" />
</id>
<property name="fileName" type="string">
<column name="fileName" length="50" />
</property>
<many-to-one
name="class"
class="com.hibernate.po.Student"
unique="true" <!-- 唯一的多对一,实际上也就变成了一对一了-->
column="stuId"/>
</class>
</hibernate-mapping>
unique="true"这个属性说明它是多对一关联的特例("多"这一方只有一个对象).
Lesson.java
public class Lesson implements java.io.Serializable
{
private lesId;
private lesName;
private Set stu2lesSet = new HashSet();
生成getter/setter方法
}
课程和关联表是一对多,这个“多”对应着关联表的集合,所以用Set集合
再来看看配置文件
Lesson.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.po.Lesson" table="Lesson" >
<id name="lesId" type="integer">
<column name="lesId" />
<generator class="native" />
</id>
<property name="lesName" type="string">
<column name="lesName" length="50" />
</property>
<set name="stu2lesSet" table="Stu2les" cascade="save-update" inverse="true" lazy="true">
<key column="lesId" />
<one-to-many class="com.hibernate.po.Stu2les" />
</set>
</class>
</hibernate-mapping>
学生表和课程表的关联表
Stu2les.java
public class Stu2les implements java.io.Serializable
{
private Integer id; 此表的主键
private Integer stuId;
private Integer lesId;
生成getter/setter方法
}
再看看配置文件
Stu2les.hbm.xml
<?xml version="1.0"?>
<!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.hibernate.po.Stu2les" table="Stu2les" >
<id name="id" type="integer">
<column name="id" />
<generator class="native" />
</id>
<property name="stuId" type="integer">
<column name="stuId" />
</property>
<property name="lesId" type="integer">
<column name="lesId" />
</property>
</class>
</hibernate-mapping>
分享到:
相关推荐
### 配置Hibernate 3.6.6.Final时出现的问题及解决办法 #### 问题背景 在配置和使用Hibernate 3.6.6.Final的过程中,开发者可能会遇到一些问题,尤其是在采用注解(Annotation)的方式进行配置时。本文将详细介绍在...
**标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...
接下来,我们讨论Hibernate 3中连接SQL的常见问题及解决方案: 1. **连接池问题**: 如果在连接数据库时遇到问题,可能是由于连接池配置不当导致的。确保正确设置了连接池的大小、超时时间等参数,并检查数据库...
然而,在实际应用中,可能会遇到一些问题,比如“org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: The url cannot be null”的异常。这个异常通常意味着Hibernate在尝试建立数据库连接时,...
### Hibernate的Antlr在Weblogic中产生Jar冲突的解决办法 #### 背景与问题描述 在使用Hibernate框架进行Java应用开发时,特别是在Weblogic服务器环境下部署应用程序时,可能会遇到一个常见问题:由于不同版本的...
以上这些问题和解决办法都是在实际项目开发中常见的问题,通过有效的沟通、规范的代码管理和细致的测试,可以避免或解决这些问题,提高项目的质量和效率。在团队协作中,遇到问题并不可怕,关键是要有解决问题的决心...
在使用Hibernate进行Java持久化操作时,可能会遇到各种各样的问题。以下是一些常见的错误及其解决方案: 1. **配置文件路径问题**: 当系统报错找不到`hibernate.cfg.xml`配置文件时,通常是因为文件位置不正确。...
在使用Hibernate时,可能会遇到`HibernateException`,这通常表示与数据持久化有关的问题。处理这类异常需要理解Hibernate的日志输出,以找出具体的问题所在,例如实体验证失败、事务处理错误等。 【Struts2异常...
【标题】"HibernateDemo2" 是一个基于...在CSDN博主的文章中,可能会详细讲解每个步骤,包括配置文件的编写、实体类的创建、数据库操作的实现以及可能遇到的问题和解决办法。对于初学者来说,这是一个很好的学习资源。
J2EE开发中遇到的乱码问题是一个常见的困扰,尤其是在处理中文字符时。本文将详细介绍如何解决这些问题,以一个基于Eclipse 3.3 + MyEclipse 6.0 + Tomcat 5.5的项目为例,该项目采用了Ext、Struts和Hibernate框架。...
标题与描述概述的知识点主要集中在Hibernate映射过程中可能遇到的各种异常情况,这涉及到数据库与对象模型之间的映射问题,以及Hibernate框架在处理这些映射时可能产生的错误。下面将对这些异常进行详细的解释和分析...
在DWR实例中,你可能会遇到以下常见问题及其解决办法: 1. **跨域问题**:DWR默认支持跨域,但如果遇到问题,可以检查配置文件`dwr.xml`中的跨域设置,或者使用CORS策略。 2. **缓存问题**:如果页面上的数据没有...
"readme.txt"通常是项目说明文件,里面可能包含了项目结构、运行步骤以及可能遇到的问题和解决办法。 通过这个实战项目,开发者可以系统性地学习和掌握Struts2、Spring和Hibernate的集成应用,了解如何在实际项目中...
通过这个项目,你可以实际操作一遍SSH框架的搭建,遇到问题时,可参考提供的错误解决办法文档,以便快速定位并解决问题。 总结来说,SSH框架的搭建涉及SpringMVC的请求处理、Spring的依赖注入和事务管理,以及...
通过本文档的学习,我们了解了如何在特定环境下配置Spring与Hibernate的集成,并解决了实际部署过程中可能遇到的一些常见问题。这为构建基于Spring、Hibernate与Struts的企业级应用打下了坚实的基础。需要注意的是,...
在学习过程中,可能会遇到如懒加载、代理对象、集合初始化等问题,这些问题在代码中都有详细的注释解释,记录了我对这些技术点的理解和解决办法。 通过深入学习和实践这些代码,不仅可以掌握Hibernate的基本用法,...
解决办法是从Spring提供的lib目录中获取这两个jar的兼容版本。 2. **HQL查询错误**: 当你遇到`java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode`时,可能是你在...
在学习Hibernate的过程中,首先会遇到模型不匹配的问题,即阻抗不匹配,这是由于Java对象模型和数据库关系模型在概念上有较大差异。Java模型强调继承、关联和多态等概念,而数据库模型则以表、主键和外键为基础。...
在IT行业中,Spring框架以其强大的依赖注入和AOP(面向切面编程)能力而闻名,尤其是在企业级应用开发中。本案例重点探讨了Spring如何与两种流行的数据访问技术——JDBC(Java Database Connectivity)和Hibernate...