Gson 与休眠 - 尝试加载惰性属性时出错



我有一个实现如下的类:

public class User implements Serializable  {
@Id
@Column(name = "USER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "USER_LOG")
private String log;
@Column(name = "USER_PASSWORD")
private String password;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "CATG_USER_FK",
foreignKey = @ForeignKey(name = "CATG_TOUSERFK_FK")
)
private List<Category> categories;

如您所见,列表类别在需要时由休眠延迟加载。

在其他代码段中,我想从 Hibernate 正确加载的对象用户中获取 JSON 字符串:

User oneUser = BBDDController.getUserById(1L);
System.out.println("User is: " + oneUser.getLog());//just to check.
//Now its time to transform to JSON.
Gson son = new Gson();
String str= son.toJson(oneUser);
System.out.println("String of JSON: " + str);

然后出现了错误:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:445)
at java.lang.StringBuffer.append(StringBuffer.java:270)
at java.io.StringWriter.write(StringWriter.java:101)
at com.google.gson.stream.JsonWriter.string(JsonWriter.java:566)
at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402)
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:527)
at com.google.gson.internal.bind.TypeAdapters$11.write(TypeAdapters.java:310)
at com.google.gson.internal.bind.TypeAdapters$11.write(TypeAdapters.java:295)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976)

此错误会一次又一次地重复。 如果我尝试使用代码加载的列表加载假用户(我的意思是,如果我在没有休眠干预的情况下通过代码创建用户对象(,Gson 工作正常。

请帮忙吗?从Hibernate加载很好,但似乎Lazy不适用于Gson。休眠会话始终处于打开状态。我想避免在用户中获取 = FetchType.EAGER ,如果我尝试使用此选项,它无论如何都会以相同的方式崩溃。

谢谢。

-----编辑------ 也许Hibernate在这里没有错。我尝试为用户创建一个大型类别列表,错误是相同的。也许 Gson 中列表的元素数量或此元素的类型是否有任何限制?

类别是否引用了用户?如果是,那就很明显了

gson 使用引用它转到类别并从类别返回到同一用户

要在序列化期间忽略属性,您可以使用

@Expose(serialize = false, deserialize = false)

最新更新