Java 在hibernate和jackson中反序列化延迟加载
是否有一种方法可以使用id而不是POJO对象保持延迟加载和反序列化对象 我有两个类,它们通过多对多关系连接在一起 像这样的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",
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
标志