我有一个包含Child对象列表的Parent对象。当我获取这些Parent的列表(在网格中显示)时,我不想要所有的Child对象 - 这只会浪费时间和内存。但是,当我获取单个Parent(以显示不同页面上父项的所有详细信息)时,我想要一个其子项列表。
class Parent {
String name;
List<Child> children;
}
class Child {
String name;
Date birthDate;
}
所以我在Children上设置了lazy-fetch,这样默认情况下不返回Children(获取列表时),但是我可以将FetchMode设置为JOIN以返回单个Parent的完整对象(Parent + Children)我要它。这很好。
但是,对于我的动作类,它查询这两组数据以“返回”它到我的JSP屏幕,我使用Gson.toJson(对象)来格式化它。这会抛出一个LazyInitializationException,因为它试图获取Children。当我不需要这些数据时,我不想让孩子被抓取。
因此,这提出了一些关于如何“解决”这种情况的问题:
1)我可以告诉/配置Gson不要获取丢失的懒惰孩子吗?
2)如果没有,是否有一个替代Json格式化程序的Gson将尊重hibernate lazy-fetch?
3)我的操作类是否有另一种方法可以返回或使从bean中获取的Java bean对象可访问到JSP,以便数据可用于填充字段和网格,而不是使用json格式?
答案 0 :(得分:4)
我接受了Sandhu提供的链接,导致从序列化和反序列化中排除字段:
https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ
使用这个策略,我明白了:
class Parent {
String name;
transient List<Child> children;
}
当我从DB(带子项)中检索FULL对象时,我使用它:
Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.STATIC).create();
它有点向后,因为默认值为TRANSIENT和STATIC,因此将exclude设置为仅STATIC意味着包含TRANSIENT。 (我认为他们需要一个includeFieldsWithModifiers()方法)。
总而言之,hbm.xml中定义了 lazy fetch ,当我需要所有数据时,我用 FetchMode.JOIN 覆盖它。 Gson默认忽略未提取的瞬态属性,当我需要所有数据时,jSoned&#39;我用 excludeFieldsWithModifiers 覆盖了它。
我不确定我对此设置100%满意,因为&#39;瞬态&#39;可能还有其他一些我还没有发现的效果。如果是这样,那么我想我可以设置一个用户定义的排除策略来阻止jSon触及那个未获取的属性。
国际海事组织我认为Gson正在秘密地超越它的界限&#39;获取我知道我不知道也不想要的数据。对我而言,它应该只是将对象中的任何数据转换为字符串。我认为这是一个简单的对象 - 字符串转换实用程序 - 我可以在一小时内编写。但如果它需要更加复杂,它至少应该有一个简单的&#39;转换选项 - tojSonSimple()。
一个后续问题 - 将属性设置为瞬态还有其他任何我不应该知道的不良影响吗?