`

【转载】hibernate重复映射

阅读更多
错误显示: net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: com.Order.customer
部分原文件:( customer 和 order 类关系:一对多关联)
Order.hbm.xml
……………
< many-to-one
        name = "customer"
        column = "CUSTOMER_ID"
        class = "com.Customer"
        not-null = "true"
        cascade = "save-update"
    
     />
执行文件:
………
Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      // Create some data and persist it
     tx = session.beginTransaction();

     Customer customer=new Customer();
     customer.setName("Jack");
   
     Order order=new Order();
     order.setOrderNumber("Jack_Order001");
         session.save(customer);
         session.save(order);
   tx.commit();
原因分析:因为在执行代码中,没有将 customer 和 order 类一对多关联起来,若单独持久化两个类: session.save(customer);session.save(order); 则在保存 order 的时候,由于 CUSTOMER_ID是与 customer类外键,因此无法读取 customer_id, 而在 order.hbm.xml 中指定其不为空,则产生了以上错误。
问题解决: not-null = "true" 改为:not-null="false" 虽然程序无问题,但order表 CUSTOMER_ID为空,不符合逻辑。应该将指定其一对多的关联。
order.setCustomer(customer);
      customer.getOrders().add(order);

2〉
错误显示: RROR SessionImpl:2400 - Could not synchronize database state with session
net.sf.hibernate.exception.GenericJDBCException: could not delete collection: [com.Customer.orders#2]
部分原文件:
Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
      tx = session.beginTransaction();
      Customer customer=(Customer)session.load(Customer.class,new Long(3));
      session.delete(customer);
      tx.commit();
原因分析:因为 cascade默认值为 none,所以当删除customer时,不会自动删除与其关联的order对象。
问题解决:添加语句 cascade = "delete"

3>
错误显示:
17:24:34,992 ERROR JDBCExceptionReporter:58 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'ORDER' 附近有语法错误。
17:24:34,992  WARN JDBCExceptionReporter:57 - SQL Error: 156, SQLState: HY000
17:24:35,002 ERROR JDBCExceptionReporter:58 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'ORDER' 附近有语法错误。
17:24:35,022  WARN JDBCExceptionReporter:34 - SQL Warning: 0, SQLState:
net.sf.hibernate.exception.GenericJDBCException : could not initialize collection: [com.Customer.orders#2]
部分原文件: order.hbm.xml
< hibernate-mapping >
  < class name = "com.Order" table = "ORDER" >
     < id name = "id" type = "long" column = "ID" >
        < generator class = "increment" />
      </ id >
   < property name = "orderNumber" type = "string" >
        < column name = "ORDER_NUMBER" length = "15" />
      </ property >
    
      < many-to-one
        name = "customer"
        column = "CUSTOMER_ID"
        class = "com.Customer"
        outer-join = "true" 
       />
原因分析:因为 order 表在 SQL 2000 数据库中已经定义了,如果用户在定义了 order 表,并且程序对该表进行连接等操作就会出错
问题解决:将 引用 order 处改为 [order]
< class name = "com.Order" table = "[ORDER]" >

4>
net.sf.hibernate.exception.SQLGrammarException : Could not save object
    at net.sf.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:58 )
    at net.sf.hibernate.exception.JDBCExceptionHelper.convert( JDBCExceptionHelper.java:29 )
    at net.sf.hibernate.impl.SessionImpl.convert( SessionImpl.java:4131 )
    at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier( SessionImpl.java:794 )
    at net.sf.hibernate.impl.SessionImpl.save( SessionImpl.java:749 )
    at com.BusinessService.saveCategoryWithCascade( BusinessService.java:54 )
    at com.BusinessService.test( BusinessService.java:104 )
    at com.BusinessService.main( BusinessService.java:109 )
Caused by: java.sql.SQLException : [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'CATEGORIES' 无效。
5〉
错误显示: net.sf.hibernate.MappingException : Resource: Add valid path not found
部分原文件: hibernate.hbm.xml
< hibernate-configuration >

< session-factory >
    < property name = "connection.username" > sa </ property >
    < property name = "connection.url" > jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test </ property >
    < property name = "dialect" > net.sf.hibernate.dialect.SQLServerDialect </ property >
    < property name = "myeclipse.connection.profile" > MSSQL </ property >
    < property name = "connection.password" > hheryh </ property >
    < property name = "connection.driver_class" > com.microsoft.jdbc.sqlserver.SQLServerDriver </ property >
    < mapping resource = "Add valid path" />
</ session-factory >
原因分析:找不到有效的 xml 文件
问题解决:将所有配置文件都加到 resource 里
将< mapping resource = "Add valid path" />改为
< mapping resource = "com/Customer.hbm.xml" />
< mapping resource = "com/Order.hbm.xml" />
6〉 错误显示
net.sf.hibernate.MappingException : Error reading resource: com/Customer.hbm.xml
    at net.sf.hibernate.cfg.Configuration.addResource( Configuration.java:340 )
    at net.sf.hibernate.cfg.Configuration.doConfigure( Configuration.java:1027 )
    at net.sf.hibernate.cfg.Configuration.doConfigure( Configuration.java:983 )
    at net.sf.hibernate.cfg.Configuration.configure( Configuration.java:911 )
    at net.sf.hibernate.cfg.Configuration.configure( Configuration.java:897 )
    at com.BusinessService.<clinit>( BusinessService.java:17 )
Caused by: net.sf.hibernate.MappingException : duplicate import: Customer
    at net.sf.hibernate.cfg.Mappings.addImport( Mappings.java:85 )
    at net.sf.hibernate.cfg.Binder.bindClass( Binder.java:126 )
    at net.sf.hibernate.cfg.Binder.bindRootClass( Binder.java:221 )
    at net.sf.hibernate.cfg.Binder.bindRoot( Binder.java:1256 )
    at net.sf.hibernate.cfg.Configuration.add( Configuration.java:253 )
    at net.sf.hibernate.cfg.Configuration.addInputStream( Configuration.java:289 )
    at net.sf.hibernate.cfg.Configuration.addResource( Configuration.java:337 )
    ... 5 more
部分原文件 :hibernate.hbm.xml
<? xml version = '1.0' encoding = 'UTF-8' ?>
<! DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 2.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >

<!-- Generated by MyEclipse Hibernate Tools.                   -->
< hibernate-configuration >

< session-factory >
    < property name = "connection.username" > sa </ property >
    < property name = "connection.url" > jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test </ property >
    < property name = "dialect" > net.sf.hibernate.dialect.SQLServerDialect </ property >
    < property name = "myeclipse.connection.profile" > MSSQL </ property >
    < property name = "connection.password" > hheryh </ property >
    < property name = "connection.driver_class" > com.microsoft.jdbc.sqlserver.SQLServerDriver </ property >
    < mapping resource = "com/Customer.hbm.xml" />
</ session-factory >

</ hibernate-configuration >

主程序:
static{
     try{
      // Create a configuration based on the properties file we've put
       Configuration config = new Configuration();
       config.addClass(Customer.class);
      // Get the session factory we can use for persistence
      sessionFactory = config
      .configure()
      .buildSessionFactory();
    }catch(Exception e){e.printStackTrace();}

  }
解决方法: config.addClass(Customer.class);
sessionFactory = config.configure().buildSessionFactory();

原因分析: hibernaet 配置文件有两种格式,一种是 xml 格式,一种是普通的 .property 格式 .
在 1.2 版本中,编译时自动会在 path 路径中查找 property 格式的配置文件。但不会查询 xml 格式的配置文件,因此需要在程序中手动添加 config.configure() ,但此时就不要加载了。
上面的程序 加载了一次 config.configure() ,又映射了一次,所以出错。

解决方法:
若配置文件为 xml 格式的,程序编写如下:
// Create a configuration based on the properties file we've put
       Configuration config = new Configuration();
             // Get the session factory we can use for persistence
      sessionFactory = config
      .configure()
.buildSessionFactory();

若配置文件为 property 格式的,程序编写如下:
// Create a configuration based on the properties file we've put
       Configuration config = new Configuration();
       config.addClass(Customer.class);
      // Get the session factory we can use for persistence
      sessionFactory = config.buildSessionFactory();


=========================================================
==============20090929 add=================================
7、Duplicate class/entity mapping 报错的问题
Could not parse configuration: /hibernate.cfg
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
Caused by: org.dom4j.DocumentException: FWK005 parse may not be called while pa
sing. Nested exception: FWK005 parse may not be called while parsing.

这些错误的解决方法:
总结:
HibernateSessionFactory 中 getSession() 方法加一个 synchronized
或者检查一下是否用了两个数据连接形式,保证使用的是单一实例


分享到:
评论

相关推荐

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...

    Hibernate继承映射代码

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在大型项目中,由于业务需求复杂,我们常常会使用到类的继承来组织代码结构,而Hibernate提供了对...

    hibernate关联映射实例

    在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...

    Spring+Hibernate 自动映射

    标题中的“Spring+Hibernate 自动映射”是指在Java Web开发中,利用Spring框架与Hibernate ORM工具进行数据层的整合,实现对象关系映射(ORM)的自动化处理。这一技术结合了Spring的强大依赖注入(DI)和事务管理...

    [原]Hibernate集合映射

    《Hibernate集合映射详解》 Hibernate作为Java领域中的一款强大持久化框架,其核心功能之一就是对象关系映射(ORM),使得开发者可以方便地在Java对象与数据库表之间进行交互。其中,集合映射是Hibernate中非常关键...

    Hibernate集合映射与关联关系

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...

    hibernate映射枚举类型

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...

    Hibernate 注解映射

    Hibernate 注解映射 Hibernate 注解映射是 Hibernate 框架中的一种映射方式,它使用 Java 注解来描述实体类和数据库表之间的映射关系,提高开发效率。 一、 环境搭建和基本映射 在使用 Hibernate 注解映射之前,...

    Hibernate 实体映射实例

    注:为节省空间,程序中需要的jar包,均在HibernateManytoManyMapCascadingSave.zip\HibernateManytoManyMapCascadingSave\lib\ &lt;br&gt;Hibernate 多对多实体映射实例 &lt;br&gt;学习Hibernate 实体映射的映射的好帮手...

    Hibernate容器映射技术(Set、List、Map)

    Hibernate容器映射技术(Set、List、Map)

    hibernate集合的映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...

    Hibernate高级映射实例

    本实例主要探讨的是Hibernate的高级映射技术,包括单向一对一、单向多对一、单向一对多以及单向多对多这四种关系映射。 首先,我们来理解一下什么是映射。在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,...

    hibernate array 数组映射

    在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...

    Hibernate实体映射

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本资源“Hibernate实体映射”提供了一个深入理解这一关键概念的机会,通过...

    自动生成hibernate映射文件和实体类

    "自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...

    hibernate实体映射文件字段设置默认值

    首先,我们需要了解一个基本的Hibernate映射文件结构: ```xml &lt;hibernate-mapping&gt; &lt;!-- 映射类的属性 --&gt; &lt;/hibernate-mapping&gt; ``` 这里的`&lt;class&gt;`标签表示映射到特定的Java类,其属性`name`指定了对应的...

    hibernate映射和查询

    **hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...

    Hibernate对象关系映射

    Hibernate对象关系映射一对多 很基础等文档

    Hibernate关系映射

    **标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...

    Hibernate查询映射试验

    本实践项目“Hibernate查询映射试验”旨在通过一系列示例帮助开发者掌握Hibernate中的查询映射技术,包括HQL(Hibernate Query Language)和Criteria API。 首先,Hibernate的核心是对象关系映射(ORM),它允许...

Global site tag (gtag.js) - Google Analytics