尝试使用 for 循环保存/提交数据,使用 hibernate 4.3.11.Final 和 SQLite Dialect com.enigmabridge:hibernate4-sqlite-dialect
当我运行这段代码并检查 Sqlite 数据时,我发现它只保存了 1 项(似乎它只提交了一次)并且该项是我看到的最后一项(在我生成的 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();
}
}
但是当我在 for 循环中移动 tx = session.beginTransaction();
时,我得到了
nested transactions not supported
- 我怎样才能完成我想要的(循环 5 次,每次向数据库中添加一个数据项)?
- 为什么提交只在这里运行一次?
最佳答案
当你写的时候
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);
}
关于java - For循环在Hibernate中保存数据而不添加所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023800/