Estamos utilizando Hibernate como capa de persistencia y tenemos un modelo de objetos complejo. Sin exponer el modelo de datos real, quiero explicar el problema usando el siguiente ejemplo simple.entidad de ahorro con entidades dependientes a las que se hace referencia usando hibernación
class Person {
private Integer id; //PK
private String name;
private Account account;
// other data, setters, getters
}
class Account {
private Integer id; //PK
// other data, setters, getters
}
El mapeo DB se define utilizando HBM como siguiente:
<class name="Person" table="PERSON">
<id name="id" column="ID">
<generator class="native"/>
</id>
<version name="version" type="java.lang.Long"/>
<property name="name" type="java.lang.String" length="50" column="NAME"/>
<many-to-one name="account" column="ACCOUNT_ID"
class="com.mycompany.model.Account"/>
</class>
Tengo que salvar nueva instancia poblada de Person
vinculado a existente Account
. La llamada es originada por el cliente web, por lo que en mi capa obtengo una instancia de Persona referenciada a la instancia de Account
que solo contiene su ID.
Si trato de llamar saveOrUpdate(person)
la excepción siguiente:
org.hibernate.TransientObjectException:
object references an unsaved transient instance - save the transient instance before flushing:
com.mycompany.model.Account
Para evitar esto tengo que encontrar el objeto de PERSISTED Account
por ID y luego llamar person.setAccount(persistedAccount)
. En este caso, todo funciona bien.
Pero en la vida real trato con docenas de entidades referenciadas entre sí. No quiero escribir un código especial para cada referencia.
Me pregunto si hay algún tipo de solución genérica para este problema.
Gracias, @JB Nizet. Esto es realmente lo que esperaba ... Publicaré aquí la descripción de mi solución genérica y estaré encantado de conocer su opinión. – AlexR