iteye_7219
2010-04-24 23:57
浏览 310
已采纳

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

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

}

[/code]
我在测试单元这样写的:
[code="java"]
@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);

}[/code]

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

如果我的测试单元这样写怎可以保存到数据库中:
[code="java"]
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();
}[/code]

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • njutzyg 2010-04-26 10:09
    已采纳

    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里到底是使用哪种方式保存的,都没有说清楚

    点赞 评论
  • shmaoer 2010-04-25 11:17

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

    点赞 评论
  • shmaoer 2010-04-25 11:55

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

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

    session.flush();

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

    希望对你有用,呵呵

    点赞 评论
  • njutzyg 2010-04-25 12:00

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

    点赞 评论

相关推荐 更多相似问题