Java 休眠,保存新实体而不获取关联实体

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

我正在使用SpringBoot和hibernate,试图通过只发布引用实体的id来保存具有@manytone关系的实体

@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,然后在控制器内手动将它们转换为实体,确保所有字段都符合您的需要-加载哪些字段,忽略哪些字段。