-
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个答案 按时间排序 按投票排序
-
采纳的答案
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
-
调用完成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
相关推荐
`getSession()`方法获取当前Session,`beginTransaction()`和`commit()`分别用于开始和提交事务,而`save()`方法用于保存实体到数据库。 最后,我们可以在Service或Controller中注入UserDAO,调用其方法来实现业务...
只有当满足特定条件时,Hibernate才会触发Flush操作,将这些缓存中的更改同步到数据库中。 #### 触发Flush的条件 Flush操作通常在以下几种情况下被触发: 1. **显式调用**:开发人员可以直接调用`session.flush()...
- 当调用`getSession().save(c)`时,hibernate会根据对象`Customer`和映射文件生成相应的SQL语句,然后执行这些SQL以完成对象的保存。 8. **流行ORM框架** - Hibernate因其强大功能和成熟度而受到广泛欢迎,它...
3. `addUser` 方法演示了如何添加用户,通过 `Session` 对象的 `save()` 方法保存实体到数据库。 这些内容涵盖了 Hibernate 的基础配置、映射文件的编写以及如何进行基本的数据库操作。对于进一步学习 Hibernate,...
6. **运行案例**:最后,创建一个主程序,实例化`User`对象并调用`saveUser`方法将其保存到数据库。运行程序后,你将在MySQL数据库中看到新插入的数据。 ```java public class Main { public static void main...
此配置文件是Hibernate初始化过程中的关键组成部分,它定义了应用程序与数据库交互的基本配置信息。尽管默认情况下文件名为`hibernate.cfg.xml`,但开发者可以根据需要自定义该文件的名称或存储位置。如果选择自定义...
在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 INSERT 语句逐条插入数据,会导致性能下降和内存溢出问题。因此,使用批量更新机制...
1. **show_sql**: 这个属性用于控制Hibernate是否会在执行SQL语句时将其输出到控制台。设置为`true`可以帮助开发者调试SQL语句。 - 示例:`show_sql=true` 2. **hibernate.cfg.xml**: 是Hibernate的核心配置文件,...
在这段配置中,指定了User类映射到数据库中的user表,id字段为数据库表中的id列,并设置了一个主键生成策略。name属性和birthday属性也被定义,并分别与数据库表的name和birthday列映射。 文档接下来介绍了...
1. **由 Domain Object 到 mapping 到 db**:这是官方推荐的方式,先设计好业务对象,然后编写映射文件,最后映射到数据库中对应的表。 2. **由 DB 开始**:通过反向工程工具,如 Hibernate Tools,根据数据库表自动...
当我们调用`session.save(obj)`时,Hibernate会为这个对象生成一个唯一的标识符(通常是主键),并将对象的状态保存到数据库中。如果对象是新创建的,那么它会被添加到数据库;如果对象已经存在于数据库中,那么它的...
Hibernate是一个开源的对象关系映射(ORM)框架,它能够将Java对象映射到数据库表中,并管理这些对象的生命周期。本篇文章主要介绍利用Hibernate框架来实现基本的功能操作,包括登录验证、查询、增加、修改以及删除...
Hibernate是一种Java持久化框架,它能够将面向对象模型映射到数据库表中。通过使用Hibernate,开发者可以极大地减少编写传统JDBC代码的工作量,并且能够更好地处理数据库交互逻辑。Hibernate的目标在于提供一种简单...
在本章的“最经典的Hibernate教程_从入门到精通3”中,我们将深入探讨Hibernate的关联映射,这是ORM框架中的关键概念。关联映射允许我们建立对象模型与数据库表之间的关系,使得数据操作更加方便。 首先,让我们...
然而,需要注意的是,ActionForm中的数据在转发后不再有效,因此需要将表单数据封装到一个Bean中,以便与Hibernate交互。 3. **BeanUtils工具类**: `org.apache.commons.beanutils.BeanUtils`是一个实用工具类,...
在这个示例中,我们创建了一个用户对象并将其保存到数据库中。值得注意的是,这里使用了try-catch-finally语句来确保资源的正确释放,并且在发生异常时能够回滚事务。 #### 四、Session接口及常用方法解析 - **get...
关联映射是Hibernate的重要特性,它允许我们将实体之间的关系映射到数据库表之间的关系。例如: 1. **一对一关联**:一个实体对应另一个实体的唯一实例,如员工与身份证号。可以通过在映射文件中添加`one-to-one`...