从 JSON 保存实体(其中包含另一个实体)
Save Entity (which contains another Entity) from JSON
背景:
我正在制作具有基于 JSON 的 CRUD 功能的页面。这些页面具有 select 列表,这些列表通过 Knockout.js 填充了我的实体。我有一个实体 Contract
与我的另一个实体 Organization
具有当前可为空的多对一关系 contractHolder
。
我可以通过我的 Roo 生成的控制器通过 JSON 成功创建 Contract
,只要 contractHolder
为 null。
无论我是否提供整数 ID(java.lang.Integer 无法转换为 java.util.Map)或一个完整的 JSON 对象(org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例)。
总而言之,我正在尝试使用由 select 列表确定的 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;
/* ... */
}
事实证明,我的问题出在 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 反序列化过程的一部分是将关联的实体替换为从数据库中新检索的实体。
背景:
我正在制作具有基于 JSON 的 CRUD 功能的页面。这些页面具有 select 列表,这些列表通过 Knockout.js 填充了我的实体。我有一个实体 Contract
与我的另一个实体 Organization
具有当前可为空的多对一关系 contractHolder
。
我可以通过我的 Roo 生成的控制器通过 JSON 成功创建 Contract
,只要 contractHolder
为 null。
无论我是否提供整数 ID(java.lang.Integer 无法转换为 java.util.Map)或一个完整的 JSON 对象(org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例)。
总而言之,我正在尝试使用由 select 列表确定的 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;
/* ... */
}
事实证明,我的问题出在 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 反序列化过程的一部分是将关联的实体替换为从数据库中新检索的实体。