当前位置: 首页 > 面试题库 >

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

鲜于星波
2023-03-14
问题内容

我们使用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)。在这种情况下,一切正常。

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

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 如何保存休眠实体并忽略(不正确)瞬态模式。 例如: 我想保存它: 弹簧产生错误: 问题答案: 参见http://docs.jboss.org/hibernate/validator/4.2/reference/en- US/html_single/#validator-checkconstraints- orm 。默认情况下,Hibernate(ORM)检查默认验证组的每个约束。因此,

  • 问题内容: 我使用Hibernate 4和Spring 3。 我有两个实体。 图书实体 和作者实体 和JSON取决于pom.xml 我的根上下文在这里- … servlet-context.xml 控制器。 在我的DAO中找到findAll: 在调试中,我看到该方法返回2条记录,但是Spring无法将结果转换为JSON并返回406 HTTP错误。怎么了? 我附上我在调试中看到的图像。- http:

  • 问题内容: 我的要求是将巨大的XML值保存到数据库。 在分析了几个选项之后,我最终确定了从巨大的xml生成实体bean类,然后使用hibernate对其进行持久化的过程。 我不选择创建hbm文件,而是选择hibernate注释。这样,我将使用JAXB从XSD生成Java类,并手动添加hibernate注释。 是否有任何eclipse插件或util框架可以使用默认的hibernate注释从XSD生成

  • 问题内容: 我为Hibernate / JPA配置问题感到困惑,该问题阻止了我的带有JPA注释的实体自动注册: 在我的实体课程中,我有: 在MySQL中,语言表如下所示: 我的persistence.xml看起来像: 编辑 :这是我获取EntityManager并保持的方式: 问题答案: 事实证明这很简单:直接在persistence.xml文件中列出这些类。armandino和MikelRasc

  • 问题内容: 当我使用@Entity注释类并尝试解决依赖关系时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有休眠的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hibernate

  • 问题内容: 我想使用条件(不是sql查询)从A类获取列表。有可能这样做吗?在这种情况下,投影不起作用。 问题答案: 不幸的是,标准仅允许选择根实体,而不能选择任何连接的实体。因此,如果您的ManyToMany是双向的,它将更加容易。您可以使用等同于 如果这不是一种选择,我认为唯一的方法是使用子查询,从而将等同于 因此,代码如下所示: