Hibernate DAO接口问题

时间:2008-06-19 05:33:27   来源:论坛整理  作者:  编辑:chinaitzhe
请各位帮我分析下,是什么问题?
Hibernate持久层操作代码:
public void delMember(Integer id) {
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try
{
ts = session.beginTransaction();
Users user = (Users)session.load(Users.class, id);
session.delete(user);
ts.commit();
}
catch(Exception e)
{
if(ts != null)
ts.rollback();
System.out.println("删除持久化对象出错了!");
e.printStackTrace();
}
finally
{
HibernateSessionFactory.closeSession();
}
}

Action类:
public class DeleteMemberAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
MemberService service = new MemberServiceImpl();
//删除指定ID的持久化对象
Integer id = new Integer(request.getParameter("id"));//此处的id为页面中链接传递请求的参数
service.delMember(id);
return new ActionForward("/listMember.do");
}
}

在执行Action类的时候,报错信息如下:
Hibernate: delete from hibernate.dbo.users where Id=?
com.mchange.v2.c3p0.impl.NewPooledConnection@c65fb1 invalidated by Exception: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.mchange.v2.c3p0.stmt.GooGooStatementCache$2.run(GooGooStatementCache.java:333)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:354)
CONNECTION ERROR OCCURRED!

删除持久化对象出错了!
org.hibernate.exception.JDBCConnectionException: could not delete: [com.DAO.Users#101]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.delete(BasicEntityPersister.java:2086)
at org.hibernate.persister.entity.BasicEntityPersister.delete(BasicEntityPersister.java:2213)
at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:59)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at com.DAO.HibernateDAOImpl.delMember(HibernateDAOImpl.java:76)
at com.service.MemberServiceImpl.delMember(MemberServiceImpl.java:25)
at com.struts.action.DeleteMemberAction.execute(DeleteMemberAction.java:15)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.filter.EncodingFilter.doFilter(EncodingFilter.java:27)

at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseConnection.getImplConnection(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.setupImplConnection(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement. <init>(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement. <init>(Unknown Source)
at com.microsoft.jdbc.base.BaseConnection.prepareStatement(Unknown Source)
at com.microsoft.jdbc.base.BaseConnection.prepareStatement(Unknown Source)
at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.mchange.v2.c3p0.stmt.GooGooStatementCache$2.run(GooGooStatementCache.java:333)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:354)



网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主截止到2008-06-18 01:28:41的汇总数据:
发帖数:32
结贴数:26
结贴率:81.25%
楼主加油
网友回复:1,你应该打印看一下你的ID是否传入数值
2,把你DAO里面代码改成这样试一下
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



public void delMember(Integer id) { 

Session session = HibernateSessionFactory.getSession();

Users user = (Users)session.get(Users.class, id);  

Transaction ts = null; 

try 

{ 

ts = session.beginTransaction(); 

session.delete(user); 

ts.commit(); 

} 

catch(Exception e) 

{ 

if(ts != null) 

ts.rollback(); 

System.out.println("删除持久化对象出错了!"); 

e.printStackTrace(); 

} 

finally 

{ 

HibernateSessionFactory.closeSession(); 

} 

} 



也有可能你通过ID查找的那个user对象在数据库里面不存在,所以user为null
网友回复:这个错误产生的原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用 direct (SelectMethod=direct) 模式. Direct 模式是默认的模式.


Users user = (Users)session.load(Users.class, id);
session.delete(user);

这两句要写在两个不同的事务中
网友回复:
引用 3 楼 lastsweetop 的回复:
这个错误产生的原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用 direct (SelectMethod=direct) 模式. Direct 模式是默认的模式.


Users user = (Users)session.load(Users.class, id);
session.delete(user);

这两句要写在两个不同的事务中

ls说的很具体,lz试一下,学习了
网友回复:该回复于2008-06-18 09:54:42被版主删除
网友回复:将Users user = (Users)session.load(Users.class, id);
放在Transaction之前试试
网友回复:
引用 6 楼 burningice44 的回复:
将Users user = (Users)session.load(Users.class, id);
放在Transaction之前试试

不用把,我一向都放在事务之后的
放前面,还要事务干什么?
我觉得是你传进去的那个id所对应的那条记录不是持久化状态所造成的


我猜哦
你那条要删除的记录不是通过hibernate插进去的(或不存在。。。)
而是手动在数据库里面建立的。。。
(@#&%(@#&%)(@&#%)@&*%)@
通过hibernate操作的时候最好不要手动操作数据库以避免造成对象的状态异常。。。

网友回复:该回复于2008-06-18 21:31:35被版主删除
网友回复:Can't start a cloned connection while in manual transaction mode.
原来的数据库连接呢
怎么用的是cloned的连接
网友回复:
引用 3 楼 lastsweetop 的回复:
这个错误产生的原因一般是当你在一个SQL SERVER的JDBC连接上执行多个STATEMENTS的操作,或者是手动事务状态(AutoCommit=false) 并且使用 direct (SelectMethod=direct) 模式. Direct 模式是默认的模式.


Users user = (Users)session.load(Users.class, id);
session.delete(user);

这两句要写在两个不同的事务中


楼主用的是sqlserver2000吗,还是sqlserver2005,据说这个问题在2005上已经好使了
意思是说:假如采用SelectMethod=cursor,即使是jdbc:sqlserver://localhost:1433; DatabaseName=xxx;SelectMethod=direct
这种方式的话,sqlserver不支持在一个连接上建立多个PreparedStatement等statement

然而假如要把AutoCommit设置成true的话,也就是在hibernate的配置文件中加入
<property name="hibernate.connection.autocommit">true </property>(hibernate默认似乎是false的)
这就相当于启动了autocommit功能,相当于调用了connection.setAutoCommit(true);
这样的话sqlserver就支持在一个连接上建立多个statement了

网友回复:意思是说:假如采用SelectMethod=cursor ,即使是jdbc:sqlserver://localhost:1433; DatabaseName=xxx;SelectMethod=direct

更正一下,上面应该是这样

意思是说:假如采用SelectMethod=direct(默认方式),即使是jdbc:sqlserver://localhost:1433; DatabaseName=xxx;SelectMethod=direct

假如改成SelectMethod=cursor 的话 ,sqlserver上就可以建立多个PreparedStatement等statement
网友回复:已解决!
问题是我没加红色部分的代码!

jdbc:sqlserver://localhost:1433; DatabaseName=xxx;SelectMethod=cursor
关键字:Hibernate,DAO,接口,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面