Мы используем 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
by ID, а затем вызвать person.setAccount(persistedAccount)
. В этом случае все работает нормально.
Но в реальной жизни я имею дело с десятками сущностей, на которые ссылаются друг на друга. Я не хочу писать специальный код для каждой ссылки.
Интересно, существует ли какое-то общее решение этой проблемы.