Мы используем Hibernate в качестве слоя постоянства и имеем сложную объектную модель.Не раскрывая реальную модель данных, я хочу объяснить проблему на следующем простом примере.
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
}
Отображение БД определяется с использованием HBM следующим образом:
<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>
Я должен сохранитьНовый заполненный экземпляр Person
связан с существующим Account
.Вызов инициируется веб-клиентом, поэтому на моем уровне я получаю экземпляр Person, на который ссылается экземпляр Account
, который содержит только его идентификатор.
Если я пытаюсь вызвать saveOrUpdate(person)
, выдается следующее исключение:
org.hibernate.TransientObjectException:
object references an unsaved transient instance - save the transient instance before flushing:
com.mycompany.model.Account
Чтобы избежать этого, я должен найти постоянный объект Account
по идентификатору и затем вызвать person.setAccount(persistedAccount)
.В этом случае все работает отлично.
Но в реальной жизни я имею дело с десятками сущностей, связанных друг с другом.Я не хочу писать специальный код для каждой ссылки.
Интересно, есть ли какое-то общее решение для этой проблемы.