ustcfxx
ustcfxx
2009-03-18 12:16

Hibernate 删除记录的问题

  • hibernate

应该是一个很简单的问题,下面的代码,无法实现user的删除,在日志输出中,只能看到findById()对应的Select SQL,delete函数对应的SQL看不到,应该是此句没有执行。
另外,如果直接用一个Session去做这些事的话,是可以实现删除的。
原因是什么?
请指教。

代码如下:
[code="java"]TbUserDAO userDAO = new TbUserDAO();
TbUser user = userDAO.findById("admin");
userDAO.delete(user);[/code][/code]

其中,TbUser是实体类,TbUserDAO是DAO类,findByID与delelte函数代码如下:
[code="java"] public TbUser findById(java.lang.String id) {
log.debug("getting TbUser instance with id: " + id);
try {
TbUser instance = (TbUser) getSession().get(
"org.user.model.TbUser", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}[/code]

[code="java"] public void delete(TbUser persistentInstance) {
log.debug("deleting TbUser instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}[/code]

[b]问题补充:[/b]
[code="java"]Transaction tx = HibernateSessionFactory.
getSession().beginTransaction();
TbUserDAO userDAO = new TbUserDAO();
TbUser user = userDAO.findById("admin");
userDAO.delete(user);
tx.commit();[/code]这样提交以后,仍然没有删除掉该数据.是Session的问题吗?
[b]问题补充:[/b]
to [Zoran],你的办法不行!仍然没有删除那条记录!
[b]问题补充:[/b]
to [Zoran] 我这是一个Web项目,用的Struts2+Hibernate+Spring的架构,但是没有用Spring来管理Hibernate.不知道你说的spring声明式事务是什么意思?如果是你所说的问题,具体如何改正与操作.
[b]问题补充:[/b]
[code="java"]

private static final ThreadLocal threadLocal = new ThreadLocal();
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();

    if (session == null || !session.isOpen()) {
        if (sessionFactory == null) {
            rebuildSessionFactory();
        }
        session = (sessionFactory != null) ? sessionFactory.openSession()
                : null;
        threadLocal.set(session);
    }

    return session;
}[/code]

HibernateSessionFactory的代码以及实体类的代码都是由MyEclipse的Hibernate插件自动生成的.我觉得这里可能没什么问题.是不是Session的问题,我如果只用一个Session,来做这些查询与删除的话,是没有问题的.
[b]问题补充:[/b]
to [Zoran], 我没有用Spring来管理Hibernate.Spring的配置如下:

applicationContext.xml
[code="xml"]<?xml version="1.0" encoding="UTF-8"?>
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="queryTextAction" class="org.xtwh.query.action.QueryTextAction" />
<bean id="queryMainAction" class="org.xtwh.query.action.QueryMainAction" />
<bean id="queryResultAction" class="org.xtwh.query.action.QueryResultAction" />
<bean id="queryResultListAction" class="org.xtwh.query.action.QueryResultListAction" />


<bean id="jsonPluginAction" class="test.JsonPluginAction" />
<bean id="testAction" class="test.TestAction"/>

[/code]
[b]问题补充:[/b]
to [Zoran] 我没有用Spring来管理Hibernate啊.

[b]问题补充:[/b]
to [Zoran],没有,这就是我全部的Spring了,我现在对Spring还不怎么了解,我想也不一定要用Spring来做Hibernate的管理吧.
另外,就上面这些代码来说,我觉得没有任何问题啊.为什么不能Delete?
[b]问题补充:[/b]
另外,实际是,下面的代码,可以实现我要的删除操作:
[code="java"] Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction(); TbUser user = (TbUser)session.load(TbUser.class, "admin");
session.delete(user);

} catch(Exception e) {

    } finally {            
                        tx.commit();
        session.close();
    }[/code]

[b]问题补充:[/b]
to [yuanyangaas]
[quote]你用了spring的代理管理事务,hibernate失效[/quote]
你说的是什么意思?能详细点吗?
[b]问题补充:[/b]
getSession() 代码如下:它实际上还是调用了HibernateSessionFactory这个类的getSession函数.那个函数我在上面已经帖出来了,应该没有问题.
[code="java"]public Session getSession() {
return HibernateSessionFactory.getSession();
}[/code]
[b]问题补充:[/b]
to [all] 问题成功解决.谢谢大家的帮助,下面简单总结一下.
首先要说的是,问题都不像大家列举的那样.
具体原因是在Hibernate启动过程中出现了如下的Error:
[code="txt"]ERRORmain- org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:155) Unsuccessful: alter table BSK.TB_CANCEL_INFO add constraint FK99DEA302D9E10358 foreign key (ORDERID) references BSK.TB_ORDER
ERRORmain- org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:156) ORA-02275: 此表中已经存在这样的引用约束条件[/code]
类似这样的Error有9个,主要是由于外键约束引起的.(当时我以为这些错误没有什么影响,就没有在意.)
但是,我的Hibernate的映射是由MyEclipse自带的Hibernate插件自动生成的,不知道为什么会出现这种错误.在网上找了很久,没有找到相关的解决办法.
最后,我将
[code="xml"]update[/code]
改成了:
[code="xml"]create[/code]
重新根据映射文件生成数据库,再将"create"改成"update",上面的错误消息.
这样关于数据库更新操作不能执行的问题就解决了.
最后要说的是Hibernate的Session管理方法,一般来说都是ThreadLocal的,所以在一个线程中使用getSession获取到的是同一个Session.

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

19条回答

为你推荐

换一换