【问题标题】:Save Entity (which contains another Entity) from JSON从 JSON 中保存实体(包含另一个实体)
【发布时间】:2015-01-08 21:01:15
【问题描述】:

背景:

我正在使用基于 JSON 的 CRUD 功能制作页面。这些页面具有通过 Knockout.js 填充我的实体的选择列表。我有一个实体Contract 与我的另一个实体Organization 具有当前可以为空的多对一关系contractHolder

只要contractHolder 为空,我就可以通过我的 Roo 生成的控制器通过 JSON 成功创建 Contract

无论我提供的是整数 ID(java.lang.Integer 不能转换为 java.util.Map)还是完整的 JSON 对象,我尝试创建具有非空关系的 Contract 都以错误告终(org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例)。

总而言之,我正在尝试使用由选择列表确定的 contractHolder 保存 Contract

Contract.java

public class Contract {
    /* ... */

    //@NotNull
    @ManyToOne
    private Organization contractHolder;

    /* ... */
}

Organization.java

public class Organization {
    /* ... */

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    /* ... */
}

【问题讨论】:

  • 暂时忘掉缩写词,先去 json.org 学习 JSON 语法。然后研究 Java Map 和 List 接口定义,了解它们如何映射到 JSON“对象”和“数组”。
  • @HotLicks 感谢您的快速评论!我可以成功地将所有内容反序列化并返回到我的对象中,但最后我绊倒了。
  • 我不知道您使用的是什么 JSON 工具包(Java 至少有 20 个),但您的错误表明您有一些基本的误解。 (而且您在此处提供的信息不足以成为有效的“问题”。)
  • 我发现我对 Hibernate 的基本误解。您是否会建议我在我的问题中添加更多信息、回答我的问题或其他内容?
  • 写一个简短的答案,解释你误解的根源。在(我认为是 3 天)等待期之后,将该答案标记为“已接受”。

标签: json spring-mvc knockout.js spring-roo


【解决方案1】:

事实证明,我的问题在于 Hibernate。在尝试使用非空 contractHolder 创建合同时,我正确描述了该组织,但未能说明它在会话中不存在的事实。

org.hibernate.TransientObjectException: 
    object references an unsaved transient instance - save the transient instance before flushing: com.domain.application.model.Contract.contractHolder -> com.domain.application.model.Organization;
nested exception is java.lang.IllegalStateException: 
    org.hibernate.TransientObjectException: 
        object references an unsaved transient instance - save the transient instance before flushing: com.domain.application.model.Contract.contractHolder -> com.domain.application.model.Organization

为了解决这个问题,我花时间刷新了关联的对象。

我对 Contract 的反序列化过程的一部分是将关联实体替换为其新检索自数据库的自身。

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多