`

工作中遇到的问题及解决办法18(hibernate)

阅读更多

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-distribution-3.6.6.Final时出现的问题及解决办法

    ### 配置Hibernate 3.6.6.Final时出现的问题及解决办法 #### 问题背景 在配置和使用Hibernate 3.6.6.Final的过程中,开发者可能会遇到一些问题,尤其是在采用注解(Annotation)的方式进行配置时。本文将详细介绍在...

    hibernate N+1问题解决办法

    **标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...

    HIbernate免注解实现操作数据库 及Hibernate3连接SQL的BUG解决办法

    接下来,我们讨论Hibernate 3中连接SQL的常见问题及解决方案: 1. **连接池问题**: 如果在连接数据库时遇到问题,可能是由于连接池配置不当导致的。确保正确设置了连接池的大小、超时时间等参数,并检查数据库...

    hibernate4.1.4中hibernate+Proxool无法实现加载Proxool的配置文件解决办法及jar包

    然而,在实际应用中,可能会遇到一些问题,比如“org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: The url cannot be null”的异常。这个异常通常意味着Hibernate在尝试建立数据库连接时,...

    Hibernate的Antlr在Weblogic中产生Jar冲突的解决办法

    ### Hibernate的Antlr在Weblogic中产生Jar冲突的解决办法 #### 背景与问题描述 在使用Hibernate框架进行Java应用开发时,特别是在Weblogic服务器环境下部署应用程序时,可能会遇到一个常见问题:由于不同版本的...

    遇到的问题和解决办法1

    以上这些问题和解决办法都是在实际项目开发中常见的问题,通过有效的沟通、规范的代码管理和细致的测试,可以避免或解决这些问题,提高项目的质量和效率。在团队协作中,遇到问题并不可怕,关键是要有解决问题的决心...

    使用Hibernate一些常见错误解决办法

    在使用Hibernate进行Java持久化操作时,可能会遇到各种各样的问题。以下是一些常见的错误及其解决方案: 1. **配置文件路径问题**: 当系统报错找不到`hibernate.cfg.xml`配置文件时,通常是因为文件位置不正确。...

    Java_Jdbc_Hibernate_Struts2_Android_Web异常及其处理办法

    在使用Hibernate时,可能会遇到`HibernateException`,这通常表示与数据持久化有关的问题。处理这类异常需要理解Hibernate的日志输出,以找出具体的问题所在,例如实体验证失败、事务处理错误等。 【Struts2异常...

    HibernateDemo2

    【标题】"HibernateDemo2" 是一个基于...在CSDN博主的文章中,可能会详细讲解每个步骤,包括配置文件的编写、实体类的创建、数据库操作的实现以及可能遇到的问题和解决办法。对于初学者来说,这是一个很好的学习资源。

    解决J2EE开发中乱码问题

    J2EE开发中遇到的乱码问题是一个常见的困扰,尤其是在处理中文字符时。本文将详细介绍如何解决这些问题,以一个基于Eclipse 3.3 + MyEclipse 6.0 + Tomcat 5.5的项目为例,该项目采用了Ext、Struts和Hibernate框架。...

    Hibernate映射导致的几个异常

    标题与描述概述的知识点主要集中在Hibernate映射过程中可能遇到的各种异常情况,这涉及到数据库与对象模型之间的映射问题,以及Hibernate框架在处理这些映射时可能产生的错误。下面将对这些异常进行详细的解释和分析...

    DWR框架实例及常见问题解决办法,免费放送

    在DWR实例中,你可能会遇到以下常见问题及其解决办法: 1. **跨域问题**:DWR默认支持跨域,但如果遇到问题,可以检查配置文件`dwr.xml`中的跨域设置,或者使用CORS策略。 2. **缓存问题**:如果页面上的数据没有...

    Struts2+Spring+Hibernate框架技术与项目实战 源码(上).zip

    "readme.txt"通常是项目说明文件,里面可能包含了项目结构、运行步骤以及可能遇到的问题和解决办法。 通过这个实战项目,开发者可以系统性地学习和掌握Struts2、Spring和Hibernate的集成应用,了解如何在实际项目中...

    SpringMVC+Spring+Hibernate(SSH)框架搭建之一

    通过这个项目,你可以实际操作一遍SSH框架的搭建,遇到问题时,可参考提供的错误解决办法文档,以便快速定位并解决问题。 总结来说,SSH框架的搭建涉及SpringMVC的请求处理、Spring的依赖注入和事务管理,以及...

    struts+spring+hibernate 整合笔记

    通过本文档的学习,我们了解了如何在特定环境下配置Spring与Hibernate的集成,并解决了实际部署过程中可能遇到的一些常见问题。这为构建基于Spring、Hibernate与Struts的企业级应用打下了坚实的基础。需要注意的是,...

    Hibernate编程代码

    在学习过程中,可能会遇到如懒加载、代理对象、集合初始化等问题,这些问题在代码中都有详细的注释解释,记录了我对这些技术点的理解和解决办法。 通过深入学习和实践这些代码,不仅可以掌握Hibernate的基本用法,...

    java的常见问题及解决方法参照.pdf

    解决办法是从Spring提供的lib目录中获取这两个jar的兼容版本。 2. **HQL查询错误**: 当你遇到`java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode`时,可能是你在...

    Hibernate学习笔记

    在学习Hibernate的过程中,首先会遇到模型不匹配的问题,即阻抗不匹配,这是由于Java对象模型和数据库关系模型在概念上有较大差异。Java模型强调继承、关联和多态等概念,而数据库模型则以表、主键和外键为基础。...

    spring分别与jdbc和hibernate结合的事务控制--案例

    在IT行业中,Spring框架以其强大的依赖注入和AOP(面向切面编程)能力而闻名,尤其是在企业级应用开发中。本案例重点探讨了Spring如何与两种流行的数据访问技术——JDBC(Java Database Connectivity)和Hibernate...

    java打包命令行,打包后可以像Struts,Hibernate,spring一样使用

    #### 五、常见问题及解决办法 在实际操作过程中可能会遇到各种问题,比如无法正确显示`Main-Class`属性,导致无法生成可执行的Jar文件。解决这类问题的一般步骤如下: 1. **确认Main-Class属性**:确保在manifest...

Global site tag (gtag.js) - Google Analytics