一尘不染

使用休眠模式将实体与引用的从属实体一起保存

hibernate

我们使用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的实例。

如果我尝试调用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)。在这种情况下,一切正常。

但是在现实生活中,我要处理数十个相互引用的实体。我不想为每个参考编写特殊的代码。

我想知道是否存在某种通用的解决方案。


阅读 314

收藏
2020-06-20

共1个答案

一尘不染

要保留一个实体,您只需要引用其直接依赖关系即可。这些其他实体引用其他实体的事实并不重要。

最好的方法是使用,获得引用实体的代理,甚至不访问数据库session.load(Account.class, accountId)

您要做的是正确的事情:获取对永久帐户的引用,并将该引用设置为新创建的帐户。

2020-06-20