2009-05-07 11 views
5

Was es auf der Dose sagt; Ich möchte eine Sammlung in Hibernate ändern, ohne die Sammlung zum Laden zu zwingen, da es sich um eine große Datenmenge handelt (~ 100.000 Datensätze, monoton steigend).Wie kann ich ein Element zu einer lazy-loaded Sammlung in Hibernate hinzufügen, ohne die Sammlung zu laden?

Im Moment füge ich ein Element zu dieser Liste hinzu, indem ich getEvents().add (newEvent) aufrufen, was natürlich dazu führt, dass events aufgefüllt wird.

Hier ist die Abbildung:

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

Wie soll ich das tun?

Antwort

4

Eine Möglichkeit, dies zu erreichen, wäre, eine bidirektionale Verknüpfung zwischen dem übergeordneten Objekt (nennen wir es Parent) und dem Ereignis zu erstellen und Ihre Hibernate-Zuordnungen so zu konfigurieren, dass die Beziehung von Event verwaltet wird.

Um dies zu erreichen, würde Ihre Hibernate Mappings in etwa so aussehen:

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

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

Und würde der Code etwas aussehen:

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

Hoffnung, das hilft. Viel Glück.

+0

Welche Nebenwirkungen hat das in Bezug auf die Arbeit mit dem Objekt sonst? –

+0

Es hängt wirklich davon ab, wie und wann Sie die Ergebnisse von Parent.getEvents() verwenden. Möglicherweise müssen Sie das Parent erneut abrufen und/oder es aus dem Cache ablaufen lassen ... aber in den meisten typischen Fällen müssen Sie nichts Spezielles tun und es wird "einfach funktionieren" – blahspam

1

Fügen Sie einfach das Ereignis ein.

zum Beispiel:

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

    .... 
} 

Option, die alle Ereignisse lesen kann:

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

Option, die nicht die Sammlung berühren würde:

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

Dann, wenn Sie anrufen document.getEvents() würde es abfragen und das neue Ereignis auch bekommen. Das einzige Problem ist, wenn die Sammlung bereits gelesen wurde und Sie dann das Ereignis mit der Option 2 einfügen. In diesem Fall würde getEvents() das neue Ereignis nicht enthalten, da die Sammlung bereits gelesen wurde.

+0

Grundsätzlich, was Blahspam gesagt wurde. – ccclark

Verwandte Themen