0 0

Hibernate 中getSession().save() 保存不到数据库3

为什么我的Hibernate 中getSession().save() 保存不到数据库
我的dao中怎么写的:
	/**
	 * 保存实体
	 */
	public void save(T o) {
		getSession().persist(o);
			
	}

我在测试单元这样写的:
	@Test
	public void testSave() {		
		
			ApplicationContext cxt = new ClassPathXmlApplicationContext("/applicationContext.xml");
			buyerService = (BuyerService)cxt.getBean("buyerService");
		
		
		
		
		Buyer buyer = new Buyer("dengmingti","123456","test@sina.com");
		ContactInfo contactInfo = new ContactInfo();
		contactInfo.setAddress("百色市朝阳区左家庄");
		contactInfo.setMobile("13671323507");
		contactInfo.setPhone("010-64469090-9");
		contactInfo.setPostalcode("531500");
		buyer.setContactinfo(contactInfo);
		buyer.setGender("男");
		buyer.setRealname("刘德华");
		buyer.setRegTime(new Date());
		buyerService.save(buyer);
		
	}


在dao中写 Transaction tran=getSession().beginTransaction();
tran.commit();也没有用

如果我的测试单元这样写怎可以保存到数据库中:
	protected static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");
	protected static SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
	
	@Test
	public void testSave() {
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();

		Buyer buyer = new Buyer("dengmingrun","123456","test@sina.com");
		ContactInfo contactInfo = new ContactInfo();
		contactInfo.setAddress("北海市朝阳区左家庄");
		contactInfo.setMobile("13671323507");
		contactInfo.setPhone("010-64469090-9");
		contactInfo.setPostalcode("533000");
		buyer.setContactinfo(contactInfo);
		buyer.setGender("男");
		buyer.setRealname("张学友");
		buyer.setRegTime(new Date());
	
		session.save(buyer);

		tx.commit();
		session.close();
	}


我怎样才能使用buyerService.save(buyer);存到数据库中呀?

问题补充:
shmaoer 写道
要达到一定的数据条数之后才一次性保存的。


那怎样才能不要达到一定的数据条数也能保存数据呢?

问题补充:
shmaoer 写道
调用完成save后,只是将数据纳入到了session的管理中,不会发出insert语句,session中existsInDatebase状态为false。
 
session.save(buyer);

调用flush,hibernate会清理缓存,执行sql,如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据,并且session中existsInDatebase状态为true。

session.flush();

提交事务,默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush。
  
tx.commit();

希望对你有用,呵呵


在dao中我使用getHibernateTemplate().save(o);终于成功了,
不知道为什么用getSession.save(o)为什么不可以
2010年4月24日 23:57

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

0 0

采纳的答案

   1、从你的文件来看,你应该是使用了spring;
    2、你说用getHibernateTemplate().save(o)可以成功,而getSession.save(o)却不行。有理由怀疑你是在spring的配置文件中配置了事务,而getHibernateTemplate()是Spring的方法,支持声明式事务管理,所以如果你配置了事务,它会自动调用事务并在操作完毕后自动关闭session;而单独的getSession()却与spring没有关系,它是由hibernate控制的,并不支持声明式事务管理,所以你必须调用session.flush()或transaction.commit()才可以成功保存。
  3、我怎样才能使用buyerService.save(buyer)存到数据库中呀?不妨把你的applicationContext.xml文件贴出来,看看你的service和dao关联起来了没(就是在service里有没有引用你配置的dao).现在你的dao里到底是使用哪种方式保存的,都没有说清楚

2010年4月26日 10:09
0 0

session.flush()一下,或者transaction.commit()[提交事务时会调用session.flush()]

2010年4月25日 12:00
0 0

调用完成save后,只是将数据纳入到了session的管理中,不会发出insert语句,session中existsInDatebase状态为false。
 
session.save(buyer);

调用flush,hibernate会清理缓存,执行sql,如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据,并且session中existsInDatebase状态为true。

session.flush();

提交事务,默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush。
  
tx.commit();

希望对你有用,呵呵

2010年4月25日 11:55
0 0

要达到一定的数据条数之后才一次性保存的。

2010年4月25日 11:17

相关推荐

    springboot集成hibernate

    `getSession()`方法获取当前Session,`beginTransaction()`和`commit()`分别用于开始和提交事务,而`save()`方法用于保存实体到数据库。 最后,我们可以在Service或Controller中注入UserDAO,调用其方法来实现业务...

    hibernate的flush机制

    只有当满足特定条件时,Hibernate才会触发Flush操作,将这些缓存中的更改同步到数据库中。 #### 触发Flush的条件 Flush操作通常在以下几种情况下被触发: 1. **显式调用**:开发人员可以直接调用`session.flush()...

    Hibernate较完整资料

    3. `addUser` 方法演示了如何添加用户,通过 `Session` 对象的 `save()` 方法保存实体到数据库。 这些内容涵盖了 Hibernate 的基础配置、映射文件的编写以及如何进行基本的数据库操作。对于进一步学习 Hibernate,...

    hibernate简单案例

    6. **运行案例**:最后,创建一个主程序,实例化`User`对象并调用`saveUser`方法将其保存到数据库。运行程序后,你将在MySQL数据库中看到新插入的数据。 ```java public class Main { public static void main...

    hibernate中的相关组件的介绍

    此配置文件是Hibernate初始化过程中的关键组成部分,它定义了应用程序与数据库交互的基本配置信息。尽管默认情况下文件名为`hibernate.cfg.xml`,但开发者可以根据需要自定义该文件的名称或存储位置。如果选择自定义...

    Hibernate中大量数据的更新

    在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 INSERT 语句逐条插入数据,会导致性能下降和内存溢出问题。因此,使用批量更新机制...

    Hibernate笔记总结

    1. **show_sql**: 这个属性用于控制Hibernate是否会在执行SQL语句时将其输出到控制台。设置为`true`可以帮助开发者调试SQL语句。 - 示例:`show_sql=true` 2. **hibernate.cfg.xml**: 是Hibernate的核心配置文件,...

    hibernate学习笔记定义.pdf

    在这段配置中,指定了User类映射到数据库中的user表,id字段为数据库表中的id列,并设置了一个主键生成策略。name属性和birthday属性也被定义,并分别与数据库表的name和birthday列映射。 文档接下来介绍了...

    hibernate主要知识点

    1. **由 Domain Object 到 mapping 到 db**:这是官方推荐的方式,先设计好业务对象,然后编写映射文件,最后映射到数据库中对应的表。 2. **由 DB 开始**:通过反向工程工具,如 Hibernate Tools,根据数据库表自动...

    hibernate入门实例封装了HibernateUtil

    当我们调用`session.save(obj)`时,Hibernate会为这个对象生成一个唯一的标识符(通常是主键),并将对象的状态保存到数据库中。如果对象是新创建的,那么它会被添加到数据库;如果对象已经存在于数据库中,那么它的...

    hibernate基本功能

    Hibernate是一个开源的对象关系映射(ORM)框架,它能够将Java对象映射到数据库表中,并管理这些对象的生命周期。本篇文章主要介绍利用Hibernate框架来实现基本的功能操作,包括登录验证、查询、增加、修改以及删除...

    hibernate笔记

    Hibernate是一种Java持久化框架,它能够将面向对象模型映射到数据库表中。通过使用Hibernate,开发者可以极大地减少编写传统JDBC代码的工作量,并且能够更好地处理数据库交互逻辑。Hibernate的目标在于提供一种简单...

    最经典的hibernate教程_从入门到精通3(hbiernate学习)

    在本章的“最经典的Hibernate教程_从入门到精通3”中,我们将深入探讨Hibernate的关联映射,这是ORM框架中的关键概念。关联映射允许我们建立对象模型与数据库表之间的关系,使得数据操作更加方便。 首先,让我们...

    hibernate学习笔记

    然而,需要注意的是,ActionForm中的数据在转发后不再有效,因此需要将表单数据封装到一个Bean中,以便与Hibernate交互。 3. **BeanUtils工具类**: `org.apache.commons.beanutils.BeanUtils`是一个实用工具类,...

    hibernate介绍与动手入门体验

    在这个示例中,我们创建了一个用户对象并将其保存到数据库中。值得注意的是,这里使用了try-catch-finally语句来确保资源的正确释放,并且在发生异常时能够回滚事务。 #### 四、Session接口及常用方法解析 - **get...

    Hibernate入门

    关联映射是Hibernate的重要特性,它允许我们将实体之间的关系映射到数据库表之间的关系。例如: 1. **一对一关联**:一个实体对应另一个实体的唯一实例,如员工与身份证号。可以通过在映射文件中添加`one-to-one`...

Global site tag (gtag.js) - Google Analytics