Java 休眠,保存新实体而不获取关联实体
我正在使用SpringBoot和hibernate,试图通过只发布引用实体的id来保存具有@manytone关系的实体Java 休眠,保存新实体而不获取关联实体,java,hibernate,spring-boot,jackson,Java,Hibernate,Spring Boot,Jackson,我正在使用SpringBoot和hibernate,试图通过只发布引用实体的id来保存具有@manytone关系的实体 @Entity @Table(name = "foo_table") public class Foo implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private id; @NotNull @JsonIdentityRefer
@Entity
@Table(name = "foo_table")
public class Foo implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private id;
@NotNull
@JsonIdentityReference(alwaysAsId=true)
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "bar_id", nullable = false)
private Bar bar;
...
}
@Entity
@Table(name = "bar_table")
public class Bar implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bar")
private Set<Foo> foos;
...
}
发布的JSON类似于
{
"bar" : 1
}
然而,在反序列化时,我在jackson中遇到了一个错误
"Could not read document: Unresolved forward references for: Object id [1]"
您可以更改json,以便为Jackson期望的
bar
字段提供对象类型,而不是整数,然后显式传递id
:
{
"bar": {
"id": 1
}
}
或
在Foo类中创建相应的setter-一个与ID类型具有相同输入类型的setter-在本例中为整数:
public class Foo implements Serializable {
...
@JsonProperty("bar")
public void setBar(int id) {
// For example:
this.bar = new Bar(id);
}
}
您可以更改json,以便为Jackson期望的
bar
字段提供对象类型,而不是整数,然后显式传递id
:
{
"bar": {
"id": 1
}
}
或
在Foo类中创建相应的setter-一个与ID类型具有相同输入类型的setter-在本例中为整数:
public class Foo implements Serializable {
...
@JsonProperty("bar")
public void setBar(int id) {
// For example:
this.bar = new Bar(id);
}
}
虽然这是可行的(在添加了@JsonProperty(access=access.WRITE_ONLY)之后),但是,我正在尝试使用@JsonIdentityReference(alwaysAsId=true)以同样的方式实现对Bar的序列化和反序列化,也就是说,如果它在响应中表示为{Bar:1},我也需要在post中以{Bar:1}的形式发送它。@BadrGhatasheh我很抱歉,我并没有从这个问题中得到答案——提供的类没有您说要使用的注释。更新了我的答案。但这不起作用,因为“new Bar()”未附加到实体管理器,并且将无法insert@BadrGhatasheh是的,这个问题是指反序列化错误。但如何处理数据的完整性取决于您。您可以通过调用dao.getBarById(id)从DB加载实体,之后将有一个托管实例。实际上,在序列化/反序列化步骤中处理事务不是一个好主意-通常您创建仅用于web层的附加类FooDto和BarDto,然后在控制器内手动将它们转换为实体,确保所有字段都符合您的需要-加载哪些字段,要忽略它。虽然这样做有效(在添加@JsonProperty(access=access.WRITE_ONLY)之后),但是,我正在尝试使用@JsonIdentityReference(alwaysAsId=true)以同样的方式实现对Bar的序列化和反序列化,也就是说,如果它在响应中表示为{Bar:1},我也需要以{Bar:1}的形式发送。@BadrGhatasheh我很抱歉,我并没有从这个问题中得到答案——提供的类没有您说要使用的注释。更新了我的答案。但这不起作用,因为“new Bar()”未附加到实体管理器,并且将无法insert@BadrGhatasheh是的,这个问题是指反序列化错误。但如何处理数据的完整性取决于您。您可以通过调用dao.getBarById(id)从DB加载实体,之后将有一个托管实例。实际上,在序列化/反序列化步骤中处理事务不是一个好主意-通常您创建仅用于web层的附加类FooDto和BarDto,然后在控制器内手动将它们转换为实体,确保所有字段都符合您的需要-加载哪些字段,忽略哪些字段。