Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate和jackson中反序列化延迟加载_Java_Hibernate_Jackson - Fatal编程技术网

Java 在hibernate和jackson中反序列化延迟加载

Java 在hibernate和jackson中反序列化延迟加载,java,hibernate,jackson,Java,Hibernate,Jackson,是否有一种方法可以使用id而不是POJO对象保持延迟加载和反序列化对象 我有两个类,它们通过多对多关系连接在一起 像这样的 public class User { @Id @JsonProperty public long id; @ManyToMany( fetch = FetchType.EAGER, ) @JoinTable( name = "User_EntityType",

是否有一种方法可以使用id而不是POJO对象保持延迟加载和反序列化对象

我有两个类,它们通过多对多关系连接在一起

像这样的

public class User {
    @Id
    @JsonProperty
    public long id;

    @ManyToMany(
            fetch = FetchType.EAGER,
    )
    @JoinTable(
            name = "User_EntityType",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "type_id")
    )
    @JsonProperty
    public Set<Type> types;

}

public class Type {
    @Id
    @JsonProperty
    public long id;

    @ManyToMany(
            fetch = FetchType.EAGER,
            mappedBy = "types",
            targetEntity = User.class
    )
    @JsonProperty
    public Set<User> users;
}
公共类用户{
@身份证
@JsonProperty
公共长id;
@许多(
fetch=FetchType.EAGER,
)
@可接合(
name=“User\u EntityType”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“type\u id”)
)
@JsonProperty
公共集合类型;
}
公共类类型{
@身份证
@JsonProperty
公共长id;
@许多(
fetch=FetchType.EAGER,
mappedBy=“类型”,
targetEntity=User.class
)
@JsonProperty
公共集合用户;
}
数据类型工作正常。我可以使用hibernate进行写和读,没有任何问题

然而,我希望能够返回一个带有RESTAPI的用户对象,所以我使用Jackson来反序列化它。问题是当我这样做时,它会反序列化用户对象中的每个类型,其中包括其他类型对象,并且会造成一个巨大的混乱


是否可以只返回一组长类型ID而不是一组类型?

是的,如果您使用的是Jackson 2.0,则可以使用对象标识功能

如果您使用
@JsonIdentityInfo
注释对一个类进行注释,那么Jackson将只输出该对象一次;后续引用将使用该ID。因此,只要类型输出一次,类型集就会被序列化为ID。反序列化时,Jackson会将ID转换回对象

在您的情况下,我认为您需要如下注释您的类型类:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Type {
    ...
}

有关如何使用此功能的详细信息,请参阅。

我在我的JAX-RS端点中也遇到了这个问题,它必须使用Jackson的对象映射器序列化和服务Hibernate实体。对于我来说,使用诸如
@JsonIgnore
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,…
之类的解决方案的选项不是一个选项,因为前者意味着从序列化输出中忽略关系字段,而后面的方法无论如何都无法解决问题

因此,我的解决方案是在进行实际序列化之前在映射器上设置以下标志:

ObjectMapper objMapper = new ObjectMapper();
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
这样,就没有试图填充关系对象,而是它们的ID保持不变,因此我可以在关系字段上保留
fetch=FetchType.LAZY
标志