2006/5/16

hibernate中session.delete(sql),3.1與2.0的區(qū)別,導(dǎo)致的錯(cuò)誤

今天使用session.delete(sql);報(bào)下面的錯(cuò)誤:
?
org.hibernate.MappingException: Unknown entity: java.lang.String
?at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:569)
?at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1086)
?at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:63)
?at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:579)
?
查查終于知道原因:
?
??? session.delete(sql)是2.0的接口,3.1中已經(jīng)廢棄,同時(shí)廢棄的有:
??? find()、iterate()、filter()和delete(String?hqlSelectQuery),saveOrUpdateCopy()
?
? 如果要使用的話,可以采用以下方式創(chuàng)建Session實(shí)例:?

????? org.hibernate.classic.Session?session=sessionFactory.openSession();?
?
??????org.hibernate.classic.Session保留了2.0的接口
?
下面是3.1的reference里面這樣寫(xiě)的,我使用了,但是還是報(bào)錯(cuò),郁悶:
?
1) Hibernate3.0執(zhí)行批量刪除的程序代碼:?
Session?session?=?sessionFactory.openSession();?
Transaction?tx?=?session.beginTransaction();?
String?hqlDelete?=?"delete?Customer?where?name?=?:oldName";?
int?deletedEntities?=?s.createQuery(?hqlDelete?)?
.setString(?"oldName",?oldName?)?
.executeUpdate();?
tx.commit();?
session.close();
?
2)Hibernate3.0執(zhí)行批量更新的程序代碼:?
Session?session?=?sessionFactory.openSession();?
Transaction?tx?=?session.beginTransaction();?
String?hqlUpdate?=?"update?Customer?set?name?=?:newName?where?name?=?:oldName";?
int?updatedEntities?=?s.createQuery(?hqlUpdate?)?
.setString(?"newName",?newName?)?
.setString(?"oldName",?oldName?)?
.executeUpdate();?
tx.commit();?
session.close();?
?
我按照上面的寫(xiě)法,運(yùn)行后報(bào)錯(cuò)如下:

org.hibernate.QueryException: query must begin with SELECT or FROM: delete [delete Resource r where r.nodeId=:nodeId and r.devId is not null ]
?at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:83)
?at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
?at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
?at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:176)
?at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:152)
?at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
?at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
?at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:865)
?at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89)


昨天的問(wèn)題解決了

又把hibernate3的手冊(cè)仔細(xì)的看了一遍,確認(rèn)自己的寫(xiě)法是沒(méi)錯(cuò)的,然后又上hibernate的論壇,幾乎沒(méi)有人有我的這個(gè)問(wèn)題,這才想到是不是同事在hibernate.hbm.xml中設(shè)置了什么參數(shù),使得我不能使用3.0的特性呢?
????? 看了,果真如此,郁悶哦~
???? 里面有一句:
???? <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
???? 這樣就使用了2.0的接口.郁悶啊.
???? 把這句去掉就OK了.
?
???? 附:
????? 因?yàn)槭褂昧酥形钠囱b的hql后,中文會(huì)變成問(wèn)號(hào),大致如下:
?
????? String hql="from user u where u.name like %"+userName+"%";
?
????? 3.0版本是:
????? Query query = session.createQuery("from user u where u.name like :username").setString("username",userName);




現(xiàn)在要通過(guò)一個(gè)主鍵id去數(shù)據(jù)庫(kù)中刪除對(duì)應(yīng)的一條記錄,我該怎樣做?如果是將參數(shù)delId傳遞進(jìn)來(lái)的話,那該怎么處理? 我這樣做的,但是報(bào)了錯(cuò) public void delfun(String delId) throws DatastoreException { Session session = HibernateUtil.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Info info = (Info)session.load(Info.class,id); //出錯(cuò)行 session.delete(delId); tx.commit(); } catch(Exception ex) { HibernateUtil.rollbackTransaction(tx); throw DatastoreException.datastoreError(ex); } finally { HibernateUtil.closeSession(session); } } 錯(cuò)誤信息為: com.framework.exceptions.DatastoreException.datastoreError(DatastoreException.java:28) com.service.NpisServiceImpl.delGyinfo(NpisServiceImpl.java:131)
回復(fù)人:pdvv(我愛(ài)花貓) 2006-3-1 17:32:22得分:0
?
你給出的異常應(yīng)該屬于你自己框架的信息吧,沒(méi)有多少參考價(jià)值。 使用Session.load()要確保數(shù)據(jù)一定存在,還是用get()吧; 或者直接session.delete("from INFO where ID = 1");
Top
回復(fù)人:yuanjian0211(元?jiǎng)? 2006-3-1 17:46:04得分:0
?
錯(cuò)誤提示信息為: Hibernate: select gyinfo0_.id as id0_, info0_.userid as userid0_, info0_.tit le as title0_,info0_.descript as descript0_ from Info info0_ where info0_.id=? 請(qǐng)指點(diǎn)
Top
回復(fù)人:yuanjian0211(元?jiǎng)? 2006-3-1 17:56:29得分:0
?
id在數(shù)據(jù)庫(kù)表中為bigint型 在對(duì)象中為long型
Top
回復(fù)人:iori_powermax() 2006-03-02 01:06:00得分:0
?
我也在學(xué)習(xí)hibernate,不知道說(shuō)的對(duì)不對(duì). 你刪除的應(yīng)該是整個(gè)對(duì)象,而不是一個(gè)id,所以應(yīng)該為: Info info = (Info)session.load(Info.class,id); session.delete(info); 或者還有一種刪除記錄的方法: info=(Info)sn.creatQuery("from Info as a where a.ID= '"+delId+"'").uniqueResult(); sn.delete(info); 另外想問(wèn)一下大家: hibernate的creatSQLQuery()是不是只支持查詢?好象增刪改都不可以
Top
回復(fù)人:ymfhcn(這痞子真帥) 2006-03-02 08:06:00得分:0
?
creatSQLQuery()是執(zhí)行sql語(yǔ)句的,不過(guò)稍微有些改動(dòng),里面什么SQL語(yǔ)句都可以寫(xiě)



?| = | 一般分類 | 仙俠修真 | VBScript | .NET | 面試題 | 存儲(chǔ)過(guò)程 | Hibernate | JavaScript | J2EE | Struts
自我介紹
切換風(fēng)格
訂閱我的Blog
博客日歷
文章歸檔...
最新發(fā)表...
博客統(tǒng)計(jì)...
網(wǎng)站鏈接...
資源
===========================================================
Hibernate 的 session.delete(obj
===========================================================

session.delete(obj)將obj的狀態(tài)變?yōu)閠ransient。兩種情況
1)obj是session的cache里邊的cache沒(méi)有的,比如:
session.delete(new Employee(4));
2)obj存在于session的cache中,比如:
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
session.delete(employee);

這兩種情況都是允許的,hibernate都會(huì)發(fā)送一條delete語(yǔ)句給數(shù)據(jù)庫(kù)。

delete執(zhí)行之后,如果調(diào)用了session.load(), 又可以分為兩種情況:1)在session.flush()之前,如:
tx.beginTransaction();
    session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));//發(fā)生在session.flush()之前
tx.commit();
那么hibernate會(huì)拋出ObjectDeletedException:The object with that id was deleted:

2)在session.flush()之后,如:
tx.beginTransaction();
    session.delete(new Employee(4));
session.load(Employee.class, new Integer(4));
tx.commit();

tx.beginTransaction();
session.load(Employee.class, new Integer(4));//同一個(gè)session中,上面的tx.commit()將session flush了一次。
tx.commit();
那么這個(gè)時(shí)候hibernate僅僅會(huì)拋出ObjectNotFoundException:No row with the give...
表示找不到該object。如果第二個(gè)tx里邊采用session.get()也就不會(huì)拋出exception了。

delete執(zhí)行之后,如果調(diào)用了session.save(obj):
tx.beginTransaction();
Employee employee = (Employee)session.load(Employee.class, new Integer(4));
    session.delete(employee);
System.out.println(employee);
session.save(employee);
System.out.println(employee);
tx.commit();
這種情況是完全合理的,合法的。
delete將employee從persistent的狀態(tài)變?yōu)閠ransient的狀態(tài)。
save將employee從transient狀態(tài)變?yōu)閜ersistent的狀態(tài)。
save一個(gè)被delete的obj的時(shí)候,在save處hibernate強(qiáng)制執(zhí)行session.flush(),發(fā)送delete語(yǔ)句,然后按照常規(guī)的save流程來(lái)進(jìn)行。為什么要這么做,還沒(méi)有完全想明白。

delete執(zhí)行之后,如果對(duì)obj對(duì)象屬性的修改,tx.commit()時(shí)不會(huì)進(jìn)行dirtyChecking。
這個(gè)道理比較顯然。

- 作者: HairRoot 2005年05月




hibernate連接sqlserver2000問(wèn)題的解決

這幾天在進(jìn)行數(shù)據(jù)庫(kù)的移植,將oracle數(shù)據(jù)庫(kù)的東西移植到mssqlserver 2000上
?
其中運(yùn)行一個(gè)查詢的時(shí)候,報(bào)如下的錯(cuò)誤:
?
?[Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
?
解決辦法:
?? <property name="connection.url">
?? ? jdbc:microsoft:sqlserver://192.168.1.110:2433;SelectMethod=cursor
? </property>
?
(紅色為增加的)
?
原因:
?? 1.??? 處于手動(dòng)事務(wù)狀態(tài),并且使用direct模式,因?yàn)閔ibernate默認(rèn)為direct模式,
???????? 即 SelectMethod=direct
?? 2.? ? 在一個(gè)SQL SERVER的JDBC連接上執(zhí)行多個(gè)STATEMENTS的操作


超強(qiáng)的貼,每句都是經(jīng)典
水至清則無(wú)魚(yú),人至賤則無(wú)敵! 走自己的路,讓別人打車(chē)去吧。穿別人的鞋,走自己的路,讓他們找去吧。打臺(tái)灣我捐一個(gè)月的生活費(fèi),打美國(guó)我捐一年的生活費(fèi), 打日本我捐他媽的一條命! 我不是隨便的人,我隨便起來(lái)不是人。女人無(wú)所謂正派,正派是因?yàn)槭艿降囊T不夠;男人無(wú)所謂忠誠(chéng),忠誠(chéng)是因?yàn)楸撑训幕I碼太低…… 騎白馬的不一定是王子,可能是唐僧;帶翅膀的也不一定是天使,有時(shí)候是鳥(niǎo)人。 俺的最低奮斗目標(biāo):農(nóng)婦,山泉,有點(diǎn)田。再過(guò)幾十年,我們來(lái)相會(huì),送到火葬場(chǎng),全部燒成灰,你一堆,我一堆,誰(shuí)也不認(rèn)識(shí)誰(shuí),全部送到農(nóng)村做化肥




http://iceling2008.itpub.net/category/13270/23134好東西???????? 阿法薩
http://comsmall.spaces.live.com/PersonalSpace.aspx?_c02_owner=1


遇到 "Automation服務(wù)器不能創(chuàng)建對(duì)象"

運(yùn)行 Regsvr32 scrrun.dll。