2014-09-15 1 views
0

ds_schema Я новичок весной. На картинке выше показана моя схема db:Сохранение коллекции данных в ленивую коллекцию в Spring Framework

Мне нужно каждую новую минуту загружать новые данные в реальном времени для каждой станции, и я должен назначить ее на эту станцию. Я хотел бы, чтобы суметь:

  1. сохраняется
  2. без использования FetchType.EAGER (что привело к слишком много медленным для этой цели)
  3. сохраняются в одном времени (т.е. одна связи с db, без повторения в списке функции persist на каждой отдельной 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; 
} 
+0

У вас есть конкретная проблема у вас возникли проблемы с? В настоящее время этот вопрос слишком широк, чтобы получить реальную помощь здесь на SO. – mdewitt

+0

Основная проблема заключается в том, что я должен сохранить тысячи объектов RealTimeData через минуту. Сохранение их по одному или слияние основного объекта, которому они принадлежат, требует времени больше минуты, поэтому мне нужно сделать это быстрее. – madx

+0

Возможно, мне нужно что-то вроде: HibernateTemplate template = new HibernateTemplate (sessionFactory); template.saveOrUpdateAll (список); и, тем не менее, Spring рекомендует, чтобы HibernateTemplate больше не использовался. – madx

ответ

0

Вы можете прочитать подробную информацию о решении здесь: 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"/>