Как добавить элемент в загруженную коллекцию в Hibernate, не вызывая загрузку коллекции? - PullRequest
5 голосов
/ 08 мая 2009

Что написано на банке; Я хочу изменить коллекцию в Hibernate без принудительной загрузки коллекции, поскольку это большой объем данных (~ 100 000 записей, монотонно увеличивающихся).

Прямо сейчас я добавляю элемент в этот список, вызывая getEvents ().add (newEvent), что, конечно, приводит к заполнению events.

Вот отображение:

<bag name = "events" inverse = "true" cascade = "all-delete-orphan"
 order-by = "event_date desc" lazy = "true">
  <key>
<column name = "document_id" length = "64" not-null = "true" />
  </key>
  <one-to-many class = "EventValue" />
</bag>

Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 08 мая 2009

Один из способов сделать это - создать двунаправленную ассоциацию между родительским объектом (назовем его «Родитель») и событием и сконфигурировать ваши отображения гибернации так, чтобы связью управляло событие.

Для этого ваши отображения в Hibernate будут выглядеть примерно так:

<class name="Parent"...>
    ...
    <bag name="events" lazy="true" inverse="true"...>...</bag>
    ...
</class>

<class name="Event"...> 
    <many-to-one name="parent">
    ...
</class>

И ваш код будет выглядеть так:

myEvent.setParent(parentObject);
eventDao.save(myEvent);

Надеюсь, это поможет. Удачи.

1 голос
/ 08 мая 2009

Просто вставьте событие.

например:

@Entity
public Document
{
    @ManyToOne
    Set<Event> events;

    public void addEvent( Event event )
    {
        events.add( event )
    }

}


@Entity
public Event
{
    @id
    private long id;

    @OneToMany
    private Document  doc;

    ....
}

Опция, которая может читать все события:

document.add( event );
update( document );

Опция, которая не затрагивает коллекцию:

    event = new Event();
    event.setDocument( document );
    insert( event );

Затем, когда вы вызываете document.getEvents (), он также запрашивает и получает новое событие. Единственная проблема заключается в том, что коллекция уже прочитана, а затем вы вставляете событие с помощью опции 2. В этом случае getEvents () не будет включать новое событие, так как коллекция уже прочитана.

...