【问题标题】:JPA - TransientPropertyValueException while saving object with only IDJPA - 仅使用 ID 保存对象时出现 TransientPropertyValueException
【发布时间】:2016-05-07 02:15:30
【问题描述】:

我有一个名为 invoice 的对象,其中包含一个复杂对象的字段

public class Invoice {
    @ManyToOne
    @JoinColumn(name = "id_site_to")
    private Site siteTo;
}

public class Site {
    @Id
    @GeneratedValue
    @Column(name = "id_site")
    private long id;

    private String description;
    ...
}

在我的代码中,我从 DTO 创建了一张发票。如此创建的发票包含一个没有填充所有字段但只有 ID 的站点。 当我尝试保存此发票实例(使用 JPA 存储库)时,我得到

org.hibernate.TransientPropertyValueException: Not-null property references a transient value

即使站点 ID 存在于数据库中。有一种方法可以执行此保存,而无需先通过选择从数据库中获取站点?

【问题讨论】:

  • 你能提供完整的堆栈跟踪吗?

标签: java hibernate jpa


【解决方案1】:

更改创建顺序,此错误表示您正在创建对尚未创建的对象的引用。创建站点,然后创建发票。

【讨论】:

  • 他已经在数据库中有Site。他想设置一个假的Site,只填充id,而不从数据库中加载整个Site
【解决方案2】:

如果您使用EntityManager,可以尝试拨打getReference(),详情请参考What is the difference between EntityManager.find() and EntityManger.getReference()?

使用 Hibernate 的 Session,您也可以使用 load()

所有这些方法都返回代理而不访问数据库。

一个音符

对于 Hibernate 的 Session,我使用你的方式来设置对象与 id 的关联。一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多