2009-05-07 6 views
5

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

В настоящее время я добавляю элемент в этот список, вызывая 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> 

Как я должен это делать?

ответ

4

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

Для достижения этой цели, ваши 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); 

Надеется, что это помогает. Удачи.

+0

Какие побочные эффекты имеют отношение к работе с объектом, в противном случае? –

+0

Это действительно зависит от того, как и когда вы используете результаты Parent.getEvents(). Вам может потребоваться повторно выбрать родителя и/или исправить его из кеша ... но в большинстве типичных случаев вам не нужно делать что-либо особенное, и оно «просто сработает» – blahspam

1

Просто введите мероприятие.

, например:

@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() не будет включать новое событие, поскольку коллекция уже была прочитана.

+0

В основном, что было сказано blahspam. – ccclark