Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 如何使用Jackson和Hibernate序列化和反序列化Set属性_Java_Json_Hibernate_Serialization - Fatal编程技术网

Java 如何使用Jackson和Hibernate序列化和反序列化Set属性

Java 如何使用Jackson和Hibernate序列化和反序列化Set属性,java,json,hibernate,serialization,Java,Json,Hibernate,Serialization,我用Hibernate保存了两个简单的POJO模型,并使用Jackson将对象序列化和反序列化为JSON 以下是我的模型TestCar和TestPart: 公共类测试车 { @身份证 @GeneratedValue(策略=GenerationType.AUTO) 私人长id; 私有字符串名称; @OneToMany(targetEntity=TestPart.class,mappedBy=“car”,cascade={CascadeType.PERSIST},orphanRemoving=tru

我用Hibernate保存了两个简单的POJO模型,并使用Jackson将对象序列化和反序列化为JSON

以下是我的模型TestCar和TestPart:

公共类测试车
{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@OneToMany(targetEntity=TestPart.class,mappedBy=“car”,cascade={CascadeType.PERSIST},orphanRemoving=true,fetch=FetchType.LAZY)
private Set parts=new HashSet();
}
公共类测试部件
{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@杰索尼奥雷
@许多酮
私人测试车;
}
我的Jackson初始化:

Hibernate4Module h4m=新的Hibernate4Module();
h4m.enable(Hibernate4Module.Feature.FORCE\u LAZY\u加载);
映射器=新的ObjectMapper();
映射器注册表模块(h4m);
configure(SerializationFeature.FAIL\u ON\u EMPTY\u bean,false);
mapper.enableDefaultTyping();
私有集PAR出现问题,因为它被序列化为
org.hibernate.collection.internal.PersistentSet

{
“id”:1,
“名称”:“菲亚特”,
“部件”:[“org.hibernate.collection.internal.PersistentSet”,[[“com.acme.TestPart”{
“id”:1,
“名称”:“普尔塔”
} ]
] ]
}
当我尝试反序列化它时,会抛出一个错误:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
at org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155)
at org.hibernate.collection.internal.PersistentSet.size(PersistentSet.java:160)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:308)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:116)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:53)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:320)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:497)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:101)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276)

有没有办法将hibernate PersistentSet序列化为一个简单的集合?

您似乎没有在安装模块的情况下使用ObjectMapper。也许您应该重新分配映射器变量?不确定ObjectMapper在多大程度上是可变的或构建器。

您似乎没有在安装模块的情况下使用ObjectMapper。也许您应该重新分配映射器变量?不确定ObjectMapper在多大程度上是可变的或构建器。

Hi Jan。我尝试重新分配RegirTermodule的返回值,但没有任何更改。有什么想法吗?JSON输出永远不会像你的一样。JSON应该看起来像一个常规的集合或列表(JSON中的数组)。您不应该看到任何与“持久集”相关的内容。您的JSON现在在没有启用插件的情况下被序列化(我知道扩展应该如何运行),并且您正在尝试反序列化垃圾JSON。好的,这是一个很好的观点。因此,问题在于序列化过程。我猜Hibernate4模块被加载是因为FORCE\u LAZY\u加载功能正在工作。另一方面,我引用了Hibernet4模块,正如它在github的项目页面上记录的那样。我找到的所有示例都使用与我相同的代码。嗨,Jan,当您使用具有Set或List属性的实体+Hibernate4Module+enableDefaultTyping()时,可能会出现问题。如果我禁用默认的类型设置,示例会起作用,因为类名没有序列化,但我确实需要它,因为我正在序列化多态对象。通常,您会使用
@JsonTypeInfo
来实现这一点:嗨,Jan。我尝试重新分配regirsterModule的返回值,但没有任何更改。有什么想法吗?JSON输出永远不会像你的一样。JSON应该看起来像一个常规的集合或列表(JSON中的数组)。您不应该看到任何与“持久集”相关的内容。您的JSON现在在没有启用插件的情况下被序列化(我知道扩展应该如何运行),并且您正在尝试反序列化垃圾JSON。好的,这是一个很好的观点。因此,问题在于序列化过程。我猜Hibernate4模块被加载是因为FORCE\u LAZY\u加载功能正在工作。另一方面,我引用了Hibernet4模块,正如它在github的项目页面上记录的那样。我找到的所有示例都使用与我相同的代码。嗨,Jan,当您使用具有Set或List属性的实体+Hibernate4Module+enableDefaultTyping()时,可能会出现问题。如果我禁用默认的类型设置,则示例会起作用,因为类名未序列化,但我确实需要它,因为我正在序列化多态对象。通常,您会使用
@JsonTypeInfo
来实现这一点: