Java For循环在Hibernate中保存数据,不添加所有项

Java For循环在Hibernate中保存数据,不添加所有项,java,database,hibernate,Java,Database,Hibernate,尝试使用hibernate 4.3.11.Final和SQLite方言使用for循环来保存/提交数据com.enigmabridge:hibernate4 SQLite方言 当我运行这段代码并检查Sqlite数据时,我看到它只保存了1项(似乎只提交了一次),并且其中一项是我在数据库中看到的最后一项(我生成的5项中的最后一项) configureSessionFactory(); Session session = null; Transaction tx=null; try { sess

尝试使用hibernate 4.3.11.Final和SQLite方言使用for循环来保存/提交数据
com.enigmabridge:hibernate4 SQLite方言

当我运行这段代码并检查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();
  }
}
configureSessionFactory();
会话=空;
事务tx=null;
试一试{
session=sessionFactory.openSession();
SyndEntry条目=null;
URL feedUrl=新URL(rssUrl);
SyndFeedInput=新的SyndFeedInput();
SyndFeed feed=input.build(新的XmlReader(feedUrl));
tx=session.beginTransaction();
BroadcastItem=新的BroadcastItem();
对于(int i=0;i<5;i++){
entry=(SyndEntry)feed.getEntries().get(i);
item.setMessage(entry.getTitle());
item.setLinkUrl(entry.getLink());
会话。保存(项目);
}
tx.commit();
}捕获(例外情况除外){
例如printStackTrace();
//在多个数据库写入操作之间发生任何故障时,回滚更改以使数据一致。
tx.回滚();
}最后{
if(会话!=null){
session.close();
}
}
但是当我移动
tx=session.beginTransaction()时在for循环中,我得到

不支持嵌套事务

  • 如何实现我想要的(循环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);
        }
    
    当你写作时

        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);
        }
    

    这很有效,谢谢,但是有没有办法避免每次都创建对象?有没有办法一次又一次地回收同一个对象?不,你不能,因为你的对象被你的Hibernate会话标记为“已知”。一种清楚地看到它的方法是,如果你的
    项目
    拥有一个自动递增的id,这将帮助你更好地理解你的观点。以更直观的方式,将其视为您创建了一个包含两个抽屉的框,在其中放置两个值,并在每次循环时更改它们:它保持相同的框,具有不同的值。是的,这非常清楚,是否有其他方法可以更有效地执行此操作?在任何其他策略上使用流?我这样问是因为我每次可能要插入5000个项目。再次感谢。即使您使用streams,每次都必须创建一个
    新的BroadcastItem()
    ,不幸的是,谢谢。在IntelliJ中运行代码时,它似乎在执行后没有停止,当我单击停止按钮时,它会显示以下消息
    进程已完成,退出代码130(被信号2:SIGINT中断)
    我是否在
    会话后错过了任何内容。关闭()
    ?这很有效,谢谢,但是有没有办法避免每次都创建一个对象呢?有没有办法一次又一次地回收同一个对象?不,你不能,因为你的对象被你的Hibernate会话标记为“已知”。一种清楚地看到它的方法是,如果你的
    项目
    拥有一个自动递增的id,这将帮助你更好地理解你的观点。以更直观的方式,将其视为您创建了一个包含两个抽屉的框,在其中放置两个值,并在每次循环时更改它们:它保持相同的框,具有不同的值。是的,这非常清楚,是否有其他方法可以更有效地执行此操作?在任何其他策略上使用流?我这样问是因为我每次可能要插入5000个项目。再次感谢。即使您使用streams,每次都必须创建一个
    新的BroadcastItem()
    ,不幸的是,谢谢。在IntelliJ中运行代码时,它似乎在执行后没有停止,当我单击停止按钮时,它会显示以下消息
    进程已完成,退出代码130(被信号2:SIGINT中断)
    会话.close()
    之后我是否错过了任何内容?我知道这可能会让人困惑,但我之所以包含它,是因为我理解它的方式是JDBC总是存在的,在低级别上,Hibernate构建在它之上。我认为JPA是一种规范,Hibernate是一种实现(就像EclipseLink那样),我们使用JPA注释。不试图反驳我的标签会让人困惑,只是想指出原因。你对这个问题的回答是正确的,这是一个休眠的问题。但是我的BroadcastItem类具有
    javax.persistence.*
    import。这个答案为我澄清了一些问题:我知道它可能会让人困惑,但我之所以把它包括进来,是因为我理解它的方式是JDBC总是存在,在低级别上,Hibernate构建在它之上。我认为JPA是一种规范,Hibernate是一种实现(就像EclipseLink那样),我们使用JPA注释。不试图反驳我的标签会让人困惑,只是想指出原因。你对这个问题的回答是正确的,这是一个休眠的问题。但是我的BroadcastItem类具有
    javax.persistence.*
    import。这个答案让我明白了: