【问题标题】:Hibernate Transaction: Only Last item of list is saved into the table休眠事务:仅列表的最后一项保存到表中
【发布时间】:2016-12-31 07:17:46
【问题描述】:

我有一个需要保存到数据库表中的 DTO 类的列表。由于某些我无法跟踪的未知原因,只有最后一项被保存到数据库中。

在下面找到示例服务和管理器类,

class TestService {

public void saveData(List<OrderDTO> dtolist) {
//exception handling properly
transaction.begin();
manager.saveAlldata(dtolist);
transaction.commit();
}
}

Class TestManager {
 public void saveAlldata(List<OrderDTO> dtolist) {
//exception handles properly
 for(OrderDTO dto: dtolist){
    OrderPersist persist = new OrderPersistent();
    persist.setId(dto.getId());
    persist.setItem(dto.getItem());
 //save(persist) or merge(persist);
  }
}

假设我有 2 个项目的详细信息,例如dto 列表中的 id=1, Item=S_001 和 Id=2, Item=S_002 然后只有最后一项 (2, S_002) 被保存到表中。

【问题讨论】:

    标签: java hibernate ejb


    【解决方案1】:

    你试过了吗?

    public void saveAlldata(List<OrderDTO> dtolist) {
    //exception handles properly
     for(OrderDTO dto: dtolist){
    transaction.begin();
    OrderPersist persist = new OrderPersistent();
    persist.setId(dto.getId());
    persist.setItem(dto.getItem());
    //save(persist) or merge(persist);
    transaction.commit();
    }
    }
    

    【讨论】:

      【解决方案2】:

      你需要在 for 循环中 session.save

       for(OrderDTO dto: dtolist){
          OrderPersist persist = new OrderPersistent();
          persist.setId(dto.getId());
          persist.setItem(dto.getItem());
          session.save(persist);
       }
      

      还可以考虑保存保存计数并可以使用计数器。类似于以下内容:

      if( i % 50 == 0 ) {
        session.flush();
        session.clear();
      }
      

      其中 i 是计数。

      【讨论】:

      • 这第一部分和你解释的一样,Save = session.Save(), merge=entityManager.merge();将尝试第二部分
      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多