Pergunta

Here's a simple POC:

public void main(String[] args) {
    final String FILE_NAME = "c:/poc.ser";
    try {
        HotelJdo hotel = HotelJdoFinder.findById(430);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
        // serialize the object
        oos.writeObject(hotel);
        oos.close();
        // read the object in the same vm
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME));
        HotelJdo hotel2 = (HotelJdo) ois.readObject();
        // this line throws an exception
        System.out.println("number of crs channels: " + hotel2.getAvailableRooms().size());
        ois.close();
    } catch (Exception e) {
        System.out.println("Unexpected exception:");
        e.printStackTrace();
    }
}

hotel2.getAvailableRooms() queries list of rooms that configured to use transparent indirection. And that call throws the following exception:

Exception [EclipseLink-7242] (Eclipse Persistence Services - 1.2.1.v20100428-r70
82): org.eclipse.persistence.exceptions.ValidationException
Exception Description: An attempt was made to traverse a relationship using indi
rection that had a null Session.  This often occurs when an entity with an unins
tantiated LAZY relationship is serialized and that lazy relationship is traverse
d after serialization.  To avoid this issue, instantiate the LAZY relationship p
rior to serialization.
        at org.eclipse.persistence.exceptions.ValidationException.instantiatingV
alueholderWithNullSession(ValidationException.java:975)
        at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.in
stantiate(QueryBasedValueHolder.java:83)
        at org.eclipse.persistence.internal.indirection.QueryBasedValueHolder.in
stantiate(QueryBasedValueHolder.java:75)
        at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getV
alue(DatabaseValueHolder.java:83)
        at org.eclipse.persistence.indirection.IndirectList.buildDelegate(Indire
ctList.java:237)
        at org.eclipse.persistence.indirection.IndirectList.getDelegate(Indirect
List.java:397)
        at org.eclipse.persistence.indirection.IndirectList.size(IndirectList.ja
va:726)

I understand that I can just trigger initialization of room list before serialization but I wonder how can I re-attach hotel2 object to EclipseLink session in order to get the list of room lazily.

Foi útil?

Solução

To reattach an object, you have to use the EntityManager.merge method before accessing its relationships.

Something like:

hotel2 = em.merge(hotel2);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top