【问题标题】:Persist a collection of data to a lazy collection in Spring Framework将数据集合持久化到 Spring Framework 中的惰性集合中
【发布时间】:2014-09-15 17:14:19
【问题描述】:

我是春天的新手。上图显示了我的数据库架构:

我需要每分钟为每个站点下载一个新的实时数据,并且我必须将它分配给那个站点。我想设法:

  1. 坚持
  2. 不使用 FetchType.EAGER(为此目的太慢了)
  3. 在单个时间(即与 db 的单个通信,而不在列表上迭代每个单个 RealTimeData 上的持久函数)保持前一分钟收集的 RealTimeData 集合。

这就是我想做的事情,如果我应该采取完全不同的方式来做类似的事情,任何建议都会受到赞赏。

车站等级是这样的:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(finders = { "findStationsByNum" })
@RooJson
public class Station {

    private String address;
    private String name;
    private Integer num;
    @ManyToOne(cascade = CascadeType.ALL)
    private Location location;
    @ManyToOne
    private City city;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "station", fetch=FetchType.LAZY)
    private Set<RealTimeData> real_time_data = new HashSet<RealTimeData>();

}

RealTimeData 类是这样的:

@RooJavaBean
@RooToString
@RooJpaActiveRecord(finders = { "findRealTimeDatasByCollect_dateEquals" })
@RooJson
public class RealTimeData {

    private Integer available_bike_stands;
    /* ... ... ... */
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "M-")
    private Date collect_date;
    @ManyToOne
    private Station station;
}

【问题讨论】:

  • 您有遇到的具体问题吗?目前,这个问题有点过于宽泛,无法在 SO 上获得任何真正的帮助。
  • 主要问题是我必须在一分钟内保存数千个 RealTimeData 对象。一个一个地保留它们或合并它们所属的主对象需要超过一分钟的时间,所以我需要一种更快的方法。
  • 也许我需要类似的东西: HibernateTemplate template = new HibernateTemplate(sessionFactory);模板.saveOrUpdateAll(list);但是 Spring 建议不再使用 HibernateTemplate。

标签: java hibernate persistence spring-roo


【解决方案1】:

您可以在此处阅读解决方案的详细信息: http://forum.spring.io/forum/spring-projects/roo/106714-bulk-operations-with-spring-roo

但是综合它建议使用这个:

@PersistenceContext
private EntityManager entityManager;

@Transactional
public void storeList(List<MyEntity> entities) {
  int imported = 0;
  for (MyEntity e: entities) {
    entityManager.persist(e);
    if (++imported % 50 == 0) {
      entityManager.flush();
      entityManager.clear();
    }
  }
}

或者,如果您使用的是 Spring Roo:

@Transactional
public void storeList(List<MyEntity> entities) {
    int imported = 0;
    for (MyEntity e: entities) {
        e.persist();
        if (++imported % 50 == 0) {
            e.flush();
            e.clear();
        }
    }
}

在你的 persistence.xml 的属性中设置:

<property name="hibernate.jdbc.batch_size" value="50"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多