0 0

HIbernate中session的的save方法必须要事务才能插入数据库吗???5

数据库sql
drop table  if exists clients;
create table clients(
clientId int auto_increment primary key,
clientName varchar(20) not null
);

client.hbm.xml
<class name="org.swq.chapter6.Client" table="clients">
<id name="clientId" column="clientId" type="java.lang.Integer">
<generator class="native"></generator>
</id>

<property name="clientName" type="java.lang.String">
<column name="clientName" length="20"></column>
</property>
</class>

Client类
package org.swq.chapter6;

public class Client {

private Integer clientId;
private String clientName;

public Integer getClientId() {
return clientId;
}

public void setClientId(Integer clientId) {
this.clientId = clientId;
}

public String getClientName() {
return clientName;
}

public void setClientName(String clientName) {
this.clientName = clientName;
}

}

测试方法:
         Session session = getSession();//取得session
        Client client = new Client();
        client.setClientName("client");
        session.save(client); // 保存
         session.close();

当不加入事务的时候执行,在控制台打印sql语句:
     Hibernate: insert into chapter6.clients (clientName) values (?)
问题1:
但是查询数据库中并没有添加记录?这是为什么?
但是我用sql手动添加数据时候,发现clientId已经自增了,这又是为什么?

测试方法:
        Session session = getSession();
        tx = session.beginTransaction();
Client client = new Client();
client.setClientName("client");
session.save(client);
tx.commit();
         session.close();

当加入事务的时候,数据插入没有问题,数据库中也可以查询到。
问题2:
       session的sava方法必须加入事务才能成功提交吗?
附:数据库mysql5.0

问题补充:
to llade (高级程序员)
System.out.println(session.getFlushMode());打印结果为AUTO,没有设置FlushModel,默认就为AUTO,同时我调用session.flush()同样不能持久到数据库。
但是我用sql手动添加数据时候,发现clientId已经自增了,这又是为什么?
问题补充:
to:wangxin0072000
谢谢你的提示,数据库的autocommit=1;
查询了hibernate官方指南,发现hibernate对自动提交默认为false,必须加入事务手动提交,也可以在hibernate配置文件钟加入属性connection.autocommit并设置为true(不推荐这样),这样不加入事物也可以自动提交,在没有设置改属性之前,如果不加入事物,即使调用session.flush(),数据也不能插入数据库;但还有问题:
为什么数据库中没有插入数据,自增变量的值却自增了;也就是当我在不加入事务和不设置connection.autocommit属性的情况下调用save()方法,数据库没有插入数据,但是我数据库钟设置为auto_increment的字段id的值却自增了,因为当我手动插入数据发现id值已经是2了?
2008年7月02日 14:10

2个答案 按时间排序 按投票排序

0 0

这的确取决于commit的方式,commit的方式有两种一种是手动提交,一种是自动提交。
你System.out.println(session.getFlushMode())取得的是程序端的提交方式。数据库端的你最好也测一下。
在mysql的客户端下:

mysql>select @@autocommit

如果是0 表示手动提交,如果是1表示自动提交。
如果是0 就设置成1.
set autocommit=0;

如果还是有问题,你最好把getSession();给出来,很有可能是这出问题了。

2008年7月02日 21:07
0 0

session.close();之前加上:session.flush();让session执行持久化操作。
取决于flush-mode。如果flushmode是commit则只有调用commit的时候会自动调用flush。这也为什么你加上事务的时候会在数据库看到结果。flushMode是MANUAL的时候必须显式调用session.flush才能更新到数据库中。


可以用System.out.println(session.getFlushMode());进行调试。

2008年7月02日 16:36

相关推荐

    重写hibernate的session简单增删改查

    在Hibernate中,增加数据通常通过调用Session的save()或saveOrUpdate()方法来实现。save()用于新对象的保存,如果对象已经有了ID,那么它将被更新。saveOrUpdate()会根据对象是否存在数据库中决定是插入还是更新。 ...

    hibernate session生命周期示例

    - **保存和插入**:`save()`方法用于将瞬时对象转换为持久化对象,而`persist()`方法在JPA中具有相同的功能,但在某些情况下,如已存在ID,它可能不会立即触发SQL INSERT语句。 - **更新**:调用`update()`方法将...

    hibernate数据库相关操作步骤

    - **保存/插入**:使用`Session`的`save()`或`saveOrUpdate()`方法来保存新实体到数据库。 - **更新**:对已存在的实体进行修改后,调用`Session`的`update()`方法来更新数据库。 - **删除**:通过`Session`的`...

    Hibernate的事务处理机制和flush方法的用法.docx

    在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...

    Hibernate通用数据库操作方法

    在上述代码中,我们看到了四个核心的 Hibernate 操作:插入(insert)、删除(delete)、更新(update)以及查询(select),这些都是在数据库操作中非常基础且重要的功能。 1. **插入(insert)**: `insert` ...

    JAVA的hibernate手动获取session的方法

    在Java编程中,Hibernate是一个非常流行的ORM(对象关系...通过以上步骤,你可以理解并实现Hibernate在Java应用中手动获取Session的方法。学习和熟练掌握这些知识,将有助于提高你在数据库操作方面的效率和代码质量。

    基于hibernate的简单数据库实现

    使用Hibernate添加数据时,首先需要创建一个实体类对象,然后通过Session的save()或saveOrUpdate()方法将其持久化到数据库。例如: ```java Session session = sessionFactory.openSession(); Transaction tx = ...

    hibernate数据库通用SQL代码

    接着,使用`session.save(o)`将对象保存到数据库中,最后提交事务并关闭Session。这个方法适用于任何实现了Hibernate实体类的对象,只需传入待保存的对象即可。 ```java public void insert(Object o) { Session ...

    Hibernate save persist merge探究

    save()是Hibernate早期版本中最常用的方法,用于将对象持久化到数据库中。当调用Session的save()方法时,Hibernate会为对象生成一个唯一的数据库标识(ID),并将对象的状态设置为“瞬时”到“持久化”。然而,save...

    java使用hibernate操作数据库jar

    Java使用Hibernate操作数据库是现代Java应用中常见的技术实践,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库的交互。它允许开发者用Java对象来表示数据库中的记录,而无需关心底层SQL的实现...

    hibernate 的saveOrUpdate

    反之,如果对象是新的,且没有ID,那么它会被插入到数据库中。 现在我们详细分析`saveOrUpdate`的使用: 1. **对象的状态管理**:在Hibernate中,对象有四种状态:瞬时(Transient)、持久化(Persistent)、脱管...

    HibernateSession , Transaction 研究

    1. `save()`:用于持久化一个新对象,这会在数据库中插入一条记录。 2. `update()`:更新已经持久化的对象,修改数据库中的记录。 3. `delete()`:删除已持久化的对象,从数据库中移除对应的记录。 4. `load()`和`...

    hibernate入门数据简单插入

    接着,创建一个实体对象并设置其属性,调用Session的`save()`或`saveOrUpdate()`方法保存对象到数据库。最后,提交事务(`Transaction.commit()`)以确保更改被永久保存。 6. **HQL(Hibernate Query Language)**:...

    hibernate的核心接口--Session

    Hibernate 保证同一 Session 实例缓存中的每个数据库记录仅对应一个持久化实例。 - **行为**: 在 Session 清理缓存时,会根据持久化实例的属性变化来同步更新数据库。 **3. 脱管状态 (detached)** - **定义**: ...

    对Hibernate Session做一个简单的包装

    1. **事务管理**:在执行一系列数据库操作时,我们可以使用`Session`的`beginTransaction()`和`commit()`方法开启和提交事务。为了确保数据一致性,我们需要在发生异常时回滚事务,这可以通过`Session`的`rollback()...

    java利用hibernate连接数据库

    - 插入:`session.save()`或`session.persist()`方法。 - 查询:`session.get()`或`session.load()`获取单个对象,`session.createQuery()`或`session.createCriteria()`进行复杂查询。 - 更新:`session.update...

    Hibernate持久层方法汇总

    本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...

    Hibernate插入数据

    7. **事务处理**:插入数据通常涉及数据库事务,需要在Session的beginTransaction()和commit()方法之间执行。如果发生异常,应调用rollback()方法回滚事务。 8. **刷新和关闭**:使用Session的flush()方法将内存中...

    Hibernate 中文api文档

    1. **保存(Save)**:使用`Session.save()`方法将新对象插入数据库。 2. **更新(Update)**:调用`Session.update()`方法更新已存在的对象。 3. **删除(Delete)**:使用`Session.delete()`方法从数据库中移除...

    04_传智播客hibernate教程_Session接口及getloadpersist方法

    本教程聚焦于Hibernate中的Session接口以及get、load、persist这三个常用的方法,它们是 Hibernate 实现对象-关系映射(ORM)的核心组件。 首先,我们来理解Session接口。Session在Hibernate中扮演着数据库连接的...

Global site tag (gtag.js) - Google Analytics