ustcfxx 2009-03-18 12:16
浏览 252
已采纳

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条回答

  • 小女昆玲 2009-03-19 11:37
    关注

    我都有点被 楼主整晕了···你可以先不考虑什么是生命式事务以及事务的概念 你的delete ,findById。。都可以使用下面的方法进行持久化操作 先用这种写法实现了再说吧 这是Hibernate官方推荐的写法

    [code="java"]
    public TbUser findById(java.lang.String id) {
    Session sess =HibernateSessionFactory .openSession();
    Transaction tx;
    log.debug("getting TbUser instance with id: " + id);
    try {
    tx = sess.beginTransaction();
    TbUser instance = (TbUser) sess.get(
    "org.user.model.TbUser", id);
    tx.commit();
    return instance;
    }catch(Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
    }finally {
    sess.close();
    }

    [/code]

    [code="java"]
    public void delete(TbUser persistentInstance) {
    Session sess =HibernateSessionFactory .openSession();
    Transaction tx;
    log.debug("deleting TbUser instance");
    try {
    sess.delete(persistentInstance);
    log.debug("delete successful");
    tx.commit();
    }catch (Exception e) {

    if (tx!=null) tx.rollback();

    throw e;

    }finally {

    sess.close();
    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(18条)

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题