2009-05-07 11 views
5

Lo que dice en la lata; Quiero modificar una colección en Hibernate sin forzar la carga de la colección, ya que es un gran volumen de datos (~ 100,000 registros, aumentando monótonamente).¿Cómo puedo agregar un elemento a una colección con poca carga en Hibernate sin que la colección se cargue?

En este momento, agrego un elemento a esta lista llamando al getEvents().add (newEvent) que, por supuesto, hace que se rellene events.

Aquí está el mapeo:

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

¿Cómo debería estar haciendo esto?

Respuesta

4

Una forma de lograr esto sería crear una asociación bidireccional entre el objeto principal (llamémoslo Parent) y el Evento y configurar sus asignaciones de hibernación para que la relación sea administrada por Event.

Para lograr esto, las asignaciones de Hibernate se vería algo como:

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

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

Y su código sería algo:

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

Espero que esto ayude. Buena suerte.

+0

¿Qué efectos secundarios tiene eso en términos de trabajar con el objeto, de lo contrario? –

+0

Realmente depende de cómo y cuándo se utilizan los resultados de Parent.getEvents(). Es posible que deba volver a buscar el elemento principal y/o caducarlo desde el caché ... pero en la mayoría de los casos típicos no tendrá que hacer nada especial y simplemente "funcionará" – blahspam

1

Solo inserte el evento.

por ejemplo:

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

    .... 
} 

opción que puede leer todos los eventos:

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

opción que no tocaría la colección:

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

A continuación, cuando se llama document.getEvents() también consultaría y obtendría el nuevo evento. El único problema es si la colección ya se ha leído y luego inserta el evento en la opción 2. En ese caso, getEvents() no incluiría el nuevo evento ya que la colección ya se ha leído.

+0

Básicamente se dijo lo que se dijo blahspam. – ccclark

Cuestiones relacionadas