Hibernate映射问题

来源:互联网 发布:2015汽车出口数据 编辑:程序博客网 时间:2024/05/16 07:40

  这两天遇见一个hibernate的映射问题,虽然做过几个项目,但还是一不留神栽到这里,浪费了半天的时间。下面把这个问题记录一下。

  当高高兴兴把配置弄好,方法写好运行的时候,爆出一个错:

  org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: *****(这符号是类名,如com.it.User)

  起初看到这个问题,心里想小CASE啦,于是把配置文件检查一边,class连接,都能够点过去了,再一运行,尼玛,还不行,拿着配置文件和实体改来改去还是不行.上网一看,有什么加entity,改.cfg文件,把cfg文件加入引用。

  那么问题就来了,我的项目是SSH的,根本没有cfg文件,也没有使用entity注解,而是用的Sring。

  后来发现一个负责映射扫描的文件,bean.xml

 解决这个问题后,天啊,终于改变错误类型了,爆出个 detached entity passed to persist 持久化问题 

 这个问题比较简单了,大多数情况是检查ID 是否设置值与数据库自动增长的ID冲突

 下面是网上摘录的,对错误原因分析的比较彻底:

 

    病理特征:Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.xxx.Xxx

    简单地说,发生此异常即是一个游离的对象要被持久化(save)时,其ID既要ORM框架为它生成ID值,而此实体的ID却已然有值。对于新手容易出现此异常,但一些有经验的程序员有时也会碰到此问题,笔者就有一次,故与网友们“分享这次遭遇”。

    让ORM为即将要持久的实体生成ID值(ORM的主键策略),是典型的做法,例如有自增长(即便是DBMS来做)、UUID,Hibernate框架则更多。因此,不能手工为此实体赋上ID值。笔者设计主要实体时,通常用UUID作主键,很显然它是字符型的。但是,有时会发现form表单为其赋一个长度为0的字符串,看html代码:

    <input name="id" type="text" id="id" value=""/>

    注意 value=""

    如果是增加,则不需要在form表单中安置这么个控件,笔者通常将增加和修改实体在一个form表单中完成,笔者很喜欢用Spring MVC。这时id字段被Spring MVC包装到实体中就有值了(其值是长度为0的空字符串)。ORM保存时上面的异常就来了。解决的办法很多,笔者是为其实体做一个属性编辑器,在编辑器判断ID是否为空且长度是否为0,若是,则置入一个null。在保存前检查一下ID也是一种解决办法。

    有时在一对一、一对多保存时,关联方也会存在这种情况,所以关键检查ID字段就可以了。


  希望对大家有帮助。


0 0