首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate 异常原因总结

2012-09-18 
Hibernate 错误原因总结1、错误: object references an unsaved transient instance? save the transient i

Hibernate 错误原因总结

1、错误: object references an unsaved transient instance? save the transient instance before flushing
??
?错误原因:
??
??只是生成的对象的id==null,因此,系统以为TraveCode对象存在,而TraveCode.id=null ,所以抛出此异常


?if(job.getWorkCondition().getTraveCode()!=null && job.getWorkCondition().getTraveCode().getId()==null){
??job.getWorkCondition().setTraveCode(null);
?}

?

?

2、解决a different object with the same identifier value was already associated with the session错误?

????????错误原因: 因为在hibernate中同一个session里面有了两个相同标识但是是不同实体

?

只需要进行session.clean()操作就可以解决了,但是你在clean操作后面又进行了saveOrUpdate(object)操作,有可能会报出"Found two representations of same collection",

?

其中这篇文章帮助最大http://opensource.atlassian.com/projects/hibernate/browse/HHH-509。

?

最后通过session.refresh(object)方法就可以解决了,注意,当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为refresh是从hibernate的session中去重新取object,

?

如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下

?

当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法(和saveOrUpdate(),save(),update()相比)感觉十分不爽。

?

?

3、 Hibernate 中使用? oracle 中的 函数

?????????可使用

?????????case when?条件? then?结果1 else? 结果2

?

?????public List unassignAccountStatistics(Session ses,IndexPager pager){


???????????StringBuffer innerHQL = new StringBuffer(" from Company com inner join com.clerkBD cBD join cBD.department dep inner join com.accounts account ");


???????????innerHQL.append(" where (com.source=5 or com.source is null)");


???????????innerHQL.append(" group by cBD.id,cBD.name,dep.name");


???????????Query innerQuery = ses.createQuery("select new map(dep.name as depName,cBD.id as empId,cBD.name as empName,count(com.id)

????????????????as????????total,??????????????????????????????????????? sum(account.state)?as??readNum,count(account.applyPublish) as applyNum,?

?????????????sum(case when account.deleted=1 then 1 else 0 end) as delNum) "? + innerHQL.toString());

?


???????????Query countQuery = ses.createQuery("select count(*) from Employee emp where emp = some (select bd from Company com inner join

?????????????????????????com.clerkBD bd where?????????????com.source=5 or com.source is null)");


???????????HibernateUtil.pagingQuery(pager, innerQuery, countQuery);????


???????????List innerList = innerQuery.list();??


??????????return innerList;
?????????}

?

4、net.sf.hibernate.PropertyNotFoundException: Could not find a getter for sitetitle in class dlog4j.formbean.SiteForm

?????错误原因:

?????????由于 POJO 中的 getXXX() 方法的 名称 和 POJO对应的 XML 文件中对应的 属性 名称不一致

??

5、错误1:org.hibernate.HibernateException: createCriteria is not valid without active transaction
解决:错误行是这样的?????? Criteria criteria = (persondao.getSession())
根据提示 改成这样
Transaction tx = persondao.getSession().beginTransaction();
Criteria criteria = (persondao.getSession());
……
tx.commit();
原因:Criteria不能脱离事务运行

?

6、:Exception in thread "main" org.hibernate.MappingException: Repeated column in mapping for entity: lizhx.n11n.test.User column: room_id (should be mapped with insert="false" update="false")
原因:在 XXX.hbm.xml 里有重复的映射
解决:??
<property?? name="RoomId"?? column="room_id"?? type="integer"?? not-null="false"?? length="11"/>
<many-to-one name="room" column="room_id" cascade="all" outer-join="false"/>
由于hibernate自动生成和手动添加的映射room_id影射重复导致的错误~
只需要把<property>映射删除即可……

热点排行