我们使用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。该调用是由Web客户端发起的,因此在我的层上,我获得的Person实例引用到Account仅包含其ID的实例。
Person
Account
如果我尝试调用saveOrUpdate(person),则会引发以下异常:
saveOrUpdate(person)
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.mycompany.model.Account
为避免这种情况,我必须Account按ID 查找持久对象,然后调用person.setAccount(persistedAccount)。在这种情况下,一切正常。
person.setAccount(persistedAccount)
但是在现实生活中,我要处理数十个相互引用的实体。我不想为每个参考编写特殊的代码。
我想知道是否存在某种通用的解决方案。
要保留一个实体,您只需要引用其直接依赖关系即可。这些其他实体引用其他实体的事实并不重要。
最好的方法是使用,获得引用实体的代理,甚至不访问数据库session.load(Account.class, accountId)。
session.load(Account.class, accountId)
您要做的是正确的事情:获取对永久帐户的引用,并将该引用设置为新创建的帐户。