`
uule
  • 浏览: 6350241 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

hibernate报错异常总结

阅读更多

1、A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance


Hibernate中one to many设置cascade="all"的话,那么在进行联机操作的时候,如果把一端设置成inverse="false",当进行删除的时候,删除one表记录, many一方 不会删除,而是把关联字段设置成null,这样会出现孤立的 many方 数据!解决办法就是设置 cascade="all-delete-orphan"。然而这种简单的设置,会出现上述问题。

 

当<set name="children" inverse="true" cascade="all">时,通过parent.getChildren().remove(child1);只是使child1游离成为一个“孤儿”,并不能将child1持久化到数据库表中的记录也删除。但如果cascade="all-delete-orphan"(orphan为“孤儿”),则会将child1持久化到数据库表中的记录也删除掉。


// 酒店:hotel   标志物:building

// 这二者之间是一对多的关系,一个酒店对应多个标志物。

// 酒店的配置文件中设置了对标志物的 cascade="all-delete-orphan"

执行如下代码:

  TbHotelDAO hotelDAO =new TbHotelDAO();  
  TbHotel hotel = hotelDAO.findById(44);
  hotel.setHotelName("12345");
  
  TbBuilding building2 = new TbBuilding();
  building2.setTbHotel(hotel);
  building2.setDistance("234米");
  building2.setBuildingName("阿斯顿");
  
  Set tbBuildings = new HashSet();
  tbBuildings.add(building2);
  hotel.setTbBuildings(tbBuildings); 
  
  hotelDAO.update(hotel);

报出如下异常:

A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:。。。。。。。。。。。

解决办法:

将代码

  Set tbBuildings = new HashSet();
  tbBuildings.add(building2);
  hotel.setTbBuildings(tbBuildings); 

修改为:

  Set tbBuildings = hotel.getTbBuildings();
  tbBuildings.clear();
  tbBuildings.add(building2);

 

设置位置:

<set name="hotelbookpaxdetails" cascade="all-delete-orphan" inverse="true" order-by="paxid">
            <key>
                <column name="bookingno" length="20" not-null="true" />
            </key>
            <one-to-many class="com.techson.himsnanhwa.admin.hibernate.hbm.Hotelbookpaxdetail" />
        </set>

 

 

先清空Set中以前的数据,再保存新数据!

 

2、catalog

我用myEclipse开发,基本上POJO和hbm.xml的配置文件都是自动生成的,
自动生成好的配置文件里面有一个 <catalog>这个属性,默认是数据库名
我怎么看到好多资料上面建议把这个属性去掉,说可能出现问题,究竟这个属性有什么用??

下面的catalog="onlinetest"指定了数据库为onlinetest,弄得我一直在纳闷前面的hibernate.cfg.xml里的connection.url指定的databaseName怎么就不见效果了呢。看来学习上还要认真才是!

<hibernate-mapping>
    <class name="onlinetest.Hibernate.Teacher" table="teacher" catalog="onlinetest">
        <id name="id" type="integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="name" length="20" />
        </property>
        <property name="password" type="string">
            <column name="password" length="50" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

 

3、 Illegal attempt to associate a collection with two open sessions; 

 

其实问题在于你的两个操作是否是在一个事务里,通过查看spring的事务那部分代码可以得知,如果方法在事务中,那么方法中所有的session都是同一个,这个session和对应的transaction会组装成一个sessionHolder类然后放到当前线程中,如果不在一个事务中,那么每次调用dao都会得到一个新的session,这样两次得到同一个object会使这个object和两个session关联,具体的原因就是这样的,楼主不防对照着看一下,我觉得象楼主这个操作其实应该是放到同一个事务中的,在楼主的contraller不被包含在事务中,所以才会出现这个异常的吧,另,这个异常和1:N没有什么关系的,你可以查看一下spring的sessionfactoryutil类和hibernatetransactionmanager类就明白了,我可能讲的也不是很清楚

 http://www.iteye.com/topic/60399

http://fuaotech.iteye.com/blog/1298826

 

解决方法:把ID查询和删除放到一个事物中即可。

 

@Transactional(propagation = Propagation.REQUIRED)
	public void delete(Long id) throws SystemException {
		Hotel hotel = findById(id);
		this.getBaseDao().delete(hotel);
		log.info(" delete ok.");
	}

 

4、当Group 表中使用entity-name时,以他作为对象的表也需加上entity-name,否则会报错:

An association from the table User refers to an unmapped class

 

Group.hbm.xml:

<hibernate-mapping package="com.hibernate">
   <class name="Group"
 entity-name="Tgroup" >
          <id name="groupId">
             <generator class="uuid"></generator>
           </id>
           <property name="groupName"/>
   </class> 
</hibernate-mapping>
 

 User.hbm.xml:

<hibernate-mapping package="com.hibernate">
      <class name="User">
            <id name="id" column="idd">
                <generator class="uuid"></generator>
            </id>
            <property name="name"/>
            <property name="pw"/>
           <many-to-one name="group"
 entity-name="Tgroup" column="groupId" cascade="all"/>
</class> 
</hibernate-mapping>
其实也可以这样用,不用entity-name,用table!
<hibernate-mapping package="com.hibernate">
<class name="Group"
 table="TTgroup" >
<id name="groupId">
<generator class="uuid"></generator>
</id>
<property name="groupName"/>
</class> 
</hibernate-mapping>
<hibernate-mapping package="com.hibernate">
<class name="User">
<id name="id" column="idd">
<generator class="uuid"></generator>
</id>
<property name="name"/>
<property name="pw"/>
<many-to-one name="group" column="groupId" cascade="all"/> </class>  / /这个地方可以什么都不加了 
</hibernate-mapping>
 

  了解

 

 

 

分享到:
评论

相关推荐

    WEB开发报错处理集锦

    本资源摘要信息主要总结了WEB开发中常见的报错处理方法,涵盖了Hibernate、JSP、Struts等多个软件开发中的错误处理技巧。这些知识点对于初学者和初级开发者来说非常有价值,可以帮助他们在开发中快速解决问题。 1. ...

    ssh整合出现的一些问题的解决

    #### 三、总结 SSH框架整合过程中的问题多种多样,但通过仔细检查依赖库版本、确保类库一致性以及合理排除冲突等方式,可以有效避免大多数常见问题。在遇到具体问题时,还需要根据异常信息进行具体分析,针对性地...

    J2EE(错误之数据类型转换异常)

    总结一下,J2EE开发中的数据类型转换异常通常源于不正确的类型强制转换。在使用`setAttribute`和`getAttribute`时,确保设置和获取的数据类型匹配。对于Hibernate的主键配置,理解`native`生成策略并正确配置实体类...

    com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案

    本文将深入探讨标题和描述中提到的“com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作”这一异常,以及如何在使用Hibernate、Struts进行分页时避免这一问题。我们将从异常的根本原因...

    JSON--List集合转换成JSON对象详解

    文中提到,直接使用fromObject(list)方法在Hibernate级联操作关联的对象上会报错,如果需要保留级联操作,就必须去掉映射文件中的级联配置。这是因为在进行JSON序列化时,Hibernate的关联关系可能会导致异常。 4. ...

    C3P0-jar包和依赖包.zip

    总结起来,"C3P0-jar包和依赖包.zip"包含的文件是C3P0连接池及其依赖的MChange Commons Java库,这两个库共同提供了数据库连接池管理的功能,有助于优化Java应用中的数据库访问性能。开发者在使用这些库时,需要正确...

    Oracle PlSql 存储过程

    4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错。 在存储过程中,别名不能和字段名称相同,否则将导致编译通过,但在运行阶段报错。 5. 在存储过程中,关于出现 null 的问题...

    java必备知识点大全.pdf

    报错的状态码:HTTP协议中定义了各种状态码来标识请求的响应状态。 协议以及默认的端口号:HTTP默认端口号为80,HTTPS默认端口号为443。 抽象类与接口的区别:抽象类是抽象方法和实例变量的集合,接口则定义了类...

    SQL手工注入完全篇

    5. **使用ORM框架**:如Hibernate、Entity Framework等,它们在一定程度上可以自动处理SQL注入问题。 五、安全编码实践 1. 使用最新的编程语言版本和库,因为它们通常包含更强的安全特性。 2. 避免动态SQL,尽可能...

    y2javassh 青鸟搜藏

    3. **Struts报错机制**:在应用中,Struts框架提供了丰富的异常处理机制,如全局异常处理类(Global Exception Handler)和自定义错误页面。当发生错误时,系统能够捕获并适当地呈现错误信息,保持用户体验的一致性...

    解决 java.lang.NoSuchMethodError的错误

    Java.lang.NoSuchMethodError 错误是一种常见的 Java 异常,它发生在 Java 虚拟机 (JVM) 无法找到某个类的特定方法时。这种错误可能是由于项目依赖比较复杂、Java 运行环境有问题、同一类型的 jar 包有不同版本存在...

    java注解使用例子

    1. `@Override`:确保方法真正重写了超类中的方法,如果找不到匹配的方法,则编译器会报错。 2. `@Deprecated`:标记不再推荐使用的代码,编译器或IDE会发出警告。 3. `@ SuppressWarnings`:允许程序员抑制特定的...

    2020老杜最新Java零基础进阶视频教程-注解课件

    - 在处理异常时,可以使用`@throws`注解来声明可能抛出的异常。 - 在持久化框架中,如Hibernate,注解用于标记实体类和属性,简化对象关系映射。 - 在Spring框架中,注解用于配置依赖注入、事务管理等。 - 在...

    自整理Java关于基础和框架的面试题

    ##### Ajax总结 - **Asynchronous JavaScript and XML**:一种在不重新加载整个网页的情况下更新部分网页的技术。 - 使用场景:异步数据加载、动态表单验证等。 ##### JSP9大隐视对象中四个作用域的大小与作用范围 ...

    java面试知识

    - **exception**:异常对象,在错误处理页面中可用。 ##### Forword(请求转发)与Redirect(重定向) - **转发(forward)**:服务器内部操作,只发生一次请求,地址栏不会改变。 - **重定向(redirect)**:客户端操作,...

    iteye的技术博客集合

    - **Hibernate 映射 - 多对多双向**:这部分内容讲解了 Hibernate 中多对多关系的映射方法,包括实体类的设计、XML 映射文件的编写等。 - **Java 反射应用**:这部分介绍了 Java 反射的基本概念及应用场景,如动态...

Global site tag (gtag.js) - Google Analytics