hibernate 在做更新和删除的时候一定要把事务开启

在做更新和删除的时候一定要把事务开启

在做更新和删除的时候一定要把事务开启

在做更新和删除的时候一定要把事务开启

重要的事情说三遍!!!

curd之前配置文件

<property name="hbm2ddl.auto">update</property>

练习hibernate的CURD(单表操作 save& update& delete& get/load )时,发现update&  delete方法执行不成功,冥思苦想也没想出个所以然,期间连重启等等笨办法都试了,结果毫无头绪,等到不经意间往上一翻,发现TM之前试验不利用事务提交的方法后事务没开启,WTF。。。

回顾一下不开事务也能提交的方法

session.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                // TODO Auto-generated method stub
                connection.setAutoCommit(true);
            }

        });
        //保存对象进数据库
        session.save(s);
        //强制输出sql语句
        session.flush();

整个代码。。。之前init()和destory()中红色部分注释了

package hibernate_01;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//测试的源程序要写在新建的Source Folder里 

//测试类
public class StudentsTest {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @Before
    public void init(){
        //创建配置对象
        Configuration config =new Configuration().configure();
        //创建服务注册对象
        ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
        //创建会话工厂对象
        sessionFactory=config.buildSessionFactory(serviceRegistry);
        //会话对象
        session =sessionFactory.openSession();
        //开启事务
        transaction =session.beginTransaction();

    }

    @After
    public void destory(){
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭会话工厂
    }

    @Test
    public void testSaveStudents(){

        //生成学生对象
        Students s=new Students(2,"张三","男",new Date(),"山东");

        session.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                // TODO Auto-generated method stub
                connection.setAutoCommit(true);
            }

        });
        //保存对象进数据库
        session.save(s);
        //强制输出sql语句
        session.flush();
    }

    @Test
    public void testGetStudents(){
        Students s=(Students) session.get(Students.class, 1);  //.get(查询表对应的类对象, 查询对象的主键);
        System.out.println(s.toString());

    }

    @Test
    public void testLoadStudents(){
        Students s=(Students) session.load(Students.class, 1);  //.load(查询表对应的类对象, 查询对象的主键);
        System.out.println(s.toString());

    }

    @Test
    public void testUpdateStudents(){
        Students s=(Students) session.get(Students.class, 1);
        s.setGender("女");
        session.update(s);
        session.flush();
    }

    @Test
    public void testDeleteStudents(){
        Students s=(Students) session.load(Students.class, 2);
        System.out.println(s.toString());
        session.delete(s);
        session.flush();
    }  

}

当然,不开启事务,也能执行成功(虽然麻烦),update  &delete 都要学习testSaveStudents()方法添加doWork那一段了

时间: 2024-11-08 02:22:04

hibernate 在做更新和删除的时候一定要把事务开启的相关文章

Hibernate批处理操作优化 (批量插入、更新与删除)

问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低. 工作所需,我经常要写些程序批量处理数据,每次执行几十万数据处理的时候,我机子的CPU都会飙高,而且数据处理速度会越来越慢.比如第一个1W条要5分钟,第二个1W条就要10分钟,要干其他事情的时候机子也卡的不行,只能等着处理完数据. 其实我一直认为是数据量太大,从来不认为是程序问题,所以一直没怎么关注过.

ASP.NET MVC 4 中 Controller 与 ApiController 做读取、新增、更新、删除 ( CRUD )

在 ASP.NET MVC 4 架构上,WebApi ( ApiController ) 较适合做数据处理与提供的动作,而 MVC 4 Web ( Controller ) 内比较要配合 View 层数据显示而做异动,这时候如果要把 ApiController 和 Controller 切开来,那这两个部分的沟通就会很常使用了.如果你是用 MVVM 的架构,在 Model-View View-Model 这两段,若是一页搜集各数据表的某些资料,那在 View 那一段就必须要与 WebApi 沟通

已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行

在对一个表做试验的时候,往里面添加了几条数据,后来发现原本想作为主键的字段的值都为"NULL",这可不行,删除重新来吧.选中删除的时候就出现了 "已更改或删除的行值要么不能使改行成为唯一行,要么改变了多个行(X行)"的错误. 原来是建表的时候忘了添加主键,但是现在删除也删除不了,往里面填东西吧,也填不了,也报错.没有办法啊~百度吧~各种解决办法,终于找到了我这个菜鸟能看懂而且操作出来的方法.(好方法!!!) 解决方法: 单击SQL工具栏上的"新建查询&qu

ASP入门(二十三)- 数据库插入、更新和删除操作

我们这里介绍如何使用 Recordset 对象进行插入.更新和删除操作,顺便和 SQL 语句对比. 插入记录 AddNew 方法用于插入一条记录,首先打开一个记录集,并且这个记录具备可写特性,而后调用 AddNew 方法告诉 ADO 要插入一条记录,而后分别设置各个字段的值,最后调用 Update 方法将插入的记录生效. 还是直接看具体代码和注释吧(AddNew.asp),如下: <!--#include file="../include/conn.asp"--> <

Hibernate中单向一对多删除级联数据问题

public static void main(String[] args) { // test(); // test1(); // test2(); // test3(); // test4(); // test5(); // 测试one2many 单向 test6(); // 测试单向 维护关系 delete删除操作 // test7(); // 测试单向 维护关系 delete更新操作 // test8(); } private static void test8() { // 获得 se

主题:Mybatis3.0查询,保存,更新,删除数据。

近来打算开发一个技术框架,并应用此框架开发出一个论坛,开始打算用sturts2+spring+hibernate+jquery为基础,然后再进行封装,最后形成技术框架,但通过此网站获知mybatis比hibernate更灵活,实用.因此开始逐步接触mybatis. 以下是mybatis3.0的开发实例,使用的java环境jdk5.0,ide为eclipse3.7,数据库是oracle11g. 1.数据环境配置 Xml代码   <?xml version="1.0" encodin

Hibernate单向多对一级联删除引发的问题

Hibernate单向多对一在级联删除时,会出现一些问题. 下面模拟我遇到的问题: 这次模拟与之前的一次模拟方法一直,博客:http://blog.csdn.net/openjdk8/article/details/38424403 模拟场景:有一个部门表t_dept,职位表t_position. 需求:当删除部门表时,不管职位表有没数据,照样删除.删除职位表就直接删除. 1,建表: 建表: t_dept::部门表 t_position:职位表 CREATE TABLE t_dept(    d

更新和删除数据

提示:更快的删除 如果想从表中删除所有行,不要使用DELETE.可使用TRUNCATE TABLE语句,它完成相同的工作,而速度更快(因为不记录数据的变动). 16.3 更新和删除的指导原则 前一节使用的UPDATE和DELETE语句都有WHERE子句,这样做的理由很充分.如果省略了WHERE子句,则UPDATE或DELETE将被应用到表中所有的行.换句话说,如果执行UPDATE而不带WHERE子句,则表中每一行都将用新值更新.类似地,如果执行DELETE语句而不带WHERE子句,表的所有数据都

在DataTable中更新、删除数据

/*在DataTable中选择记录*/            /* 向DataTable中插入记录如上,更新和删除如下:             * ----但是在更新和删除前,首先要找出要更新和删除的记录.             * 一种方法是遍历DataRow,搜索想要的记录,             * --〉然而更聪明的办法是使用DataTable.Select方法:table.Select();             * table.Select();//返回DataRow[],可