2009-05-07 11 views
5

Co mówi na puszce; Chcę zmodyfikować kolekcję w trybie hibernacji bez wymuszania ładowania kolekcji, ponieważ jest to duża ilość danych (~ 100 000 rekordów, monotonicznie zwiększających).Jak dodać element do wczytanej do licha kolekcji w stanie hibernacji, nie powodując wczytywania kolekcji?

W tej chwili dodaję element do tej listy, wywołując getEvents().add (newEvent), co oczywiście powoduje, że zapełni się events.

Oto odwzorowanie:

<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> 

Jak mam to robić?

Odpowiedz

4

Jednym ze sposobów osiągnięcia tego celu jest utworzenie dwukierunkowego powiązania między obiektem macierzystym (nazwijmy go Rodzicem) a Zdarzeniem i skonfigurowanie mapowania hibernacji w taki sposób, aby relacja była zarządzana przez Zdarzenie.

Aby to osiągnąć, mapowania Hibernate będzie wyglądać następująco:

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

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

a kod będzie wyglądał:

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

nadzieję, że to pomaga. Powodzenia.

+0

Jakie są efekty uboczne w zakresie pracy z obiektem, w przeciwnym razie? –

+0

To naprawdę zależy od tego, jak i kiedy używasz wyników Parent.getEvents(). Być może będziesz musiał ponownie pobrać rodzica i/lub wygaś je z pamięci podręcznej ... ale w większości typowych przypadków nie będziesz musiał robić nic specjalnego, a to będzie "po prostu działać". – blahspam

1

Wystarczy włożyć wydarzenie.

na przykład:

@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; 

    .... 
} 

opcja, że ​​może czytać wszystkie zdarzenia:

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

opcja, że ​​nie będzie dotykać kolekcji:

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

Następnie podczas rozmowy document.getEvents() zapyta i dostanie nowe wydarzenie. Jedynym problemem jest to, czy kolekcja została już przeczytana, a następnie wstawia się zdarzenie według opcji 2. W takim przypadku getEvents() nie będzie zawierało nowego zdarzenia, ponieważ kolekcja została już przeczytana.

+0

Zasadniczo, co zostało powiedziane. – ccclark

Powiązane problemy