首页 > 解决方案 > For循环在Hibernate中保存数据不添加所有项目

问题描述

尝试使用 for 循环使用带有 SQLite 方言的休眠 4.3.11.Final 保存/提交数据 com.enigmabridge:hibernate4-sqlite-dialect

当我运行此代码并检查 Sqlite 数据时,我看到它只保存了一项(似乎只提交一次),并且一项是我在数据库中看到的最后一项(我生成的 5 项中) .

configureSessionFactory();
Session session = null;
Transaction tx=null;
try {
    session = sessionFactory.openSession();
    SyndEntry entry = null;
    URL feedUrl = new URL(rssUrl);
    SyndFeedInput input = new SyndFeedInput();
    SyndFeed feed = input.build(new XmlReader(feedUrl));
    tx = session.beginTransaction();
    BroadcastItem item = new BroadcastItem();
    for (int i = 0 ; i < 5 ; i++) {
         entry = (SyndEntry) feed.getEntries().get(i);
         item.setMessage(entry.getTitle());
         item.setLinkUrl(entry.getLink());
         session.save(item);
    }
    tx.commit();
} catch (Exception ex) {
  ex.printStackTrace();
  // Rolling back the changes to make the data consistent in case of any failure in between multiple database write operations.
   tx.rollback();
} finally{
  if(session != null) {
      session.close();
  }
}

但是当我进入tx = session.beginTransaction();for 循环时,我得到

不支持嵌套事务

  1. 我怎样才能完成我想要的(循环 5 次,每次将数据项添加到数据库中)?
  2. 为什么 commit 在这里只运行一次?

标签: javadatabasehibernate

解决方案


当你写

    BroadcastItem item = new BroadcastItem();

    for (int i = 0 ; i < 5 ; i++) {
        entry = (SyndEntry) feed.getEntries().get(i);

        item.setMessage(entry.getTitle());
        item.setLinkUrl(entry.getLink());

        session.save(item);
    }

item第一次保存(创建)您的,在循环的其他时间,您保存(更新)您的item.

您只需要将您的创建放入BroadcastItem循环中,如下所示:

    for (int i = 0 ; i < 5 ; i++) {
        entry = (SyndEntry) feed.getEntries().get(i);
        BroadcastItem item = new BroadcastItem();

        item.setMessage(entry.getTitle());
        item.setLinkUrl(entry.getLink());

        session.save(item);
    }

推荐阅读