反序列化休眠和杰克逊中的延迟加载
有没有办法保持LAZY加载和反序列化使用id而不是POJO对象的对象。
我有2班加入了多对多的关系。
像这样的东西
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;
}
数据类型工作得很好。 我可以在没有问题的情况下使用hibernate进行编写和读取。
不过,我希望能够使用REST API返回一个User对象,所以我使用Jackson对其进行反序列化。 问题是,当我这样做时,它会反序列化包含其他Type对象的User对象中的每个Type,并且会产生巨大的混乱。
是否有可能只是返回一组长类型ID而不是一组类型?
是的,如果您使用Jackson 2.0,可以使用Object Identity功能。
如果您使用@JsonIdentityInfo
批注注释类,那么Jackson只会输出一次对象; 随后的引用将使用该ID代替。 因此,只要类型输出一次,您的类型集就会被序列化为ID。 当反序列化杰克逊将把ID变成对象。
在你的情况下,我认为你需要像这样注释你的Type类:
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Type {
...
}
有关如何使用此功能的详细信息,请参阅http://wiki.fasterxml.com/JacksonFeatureObjectIdentity。
我在我的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
标志。
上一篇: deserialize lazy loading in hibernate and jackson
下一篇: Delphi Datasnap client code not getting unauthorized exception