【发布时间】:2017-08-13 09:31:38
【问题描述】:
到目前为止,我对 Gson/Jackson 还没有深入的了解。请多多包涵。我必须将我的对象转换为 json 字符串。我已经尝试过 Gson 和 Jackson。我的对象有一个集合,默认情况下具有 Fetch,它是延迟加载。当我使用 session.get 获取对象并使用 Gson 的 gson.toJson(object); 进行转换时,它无法初始化该惰性集合。
1。我不想急于求成。
2。我也不想忽视它。
我只想要它应该返回 null 或为空的任何方式,而不是搞乱延迟加载收集。因为据我所知,如果它依赖于休眠,那么就不可能将它从会话中取出。是否有任何解决方法(在 Gson 或 Jackson 中)这个问题我不想总是初始化集合(但有时是肯定的)
@Entity
@JsonInclude(Include.NON_NULL)
public class Category {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany
private List<Item> itemList;
//getter setter
}
在main方法中
Session s = sessionFactory.openSession();
Transaction t = s.getTransaction();
t.begin();
Category category = null;
try{
category = s.get(Category.class, 1);
t.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
s.close();
}
try {
Gson json = new Gson();
String categoryString = json.toJson(category);
System.out.println(categoryString);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
它抛出
org.hibernate.LazyInitializationException:无法延迟初始化角色集合:com.company.entity.Category.itemList,无法初始化代理 - 无会话
【问题讨论】:
-
您能否调试您的代码并检查您要序列化的对象是否真的是瞬态的并且不再是代理? GSON 被实现为忽略空值,因此它应该忽略一个为空的集合。但是,如果您有一个代理对象,则该集合就在那里,但是当您尝试在会话之外使用它时,它会失败并出现异常。
-
@thst 从休眠会话中获取后如何显式地使对象瞬态或代理?你能解释一下吗? cox 我正在使用@JsonInclude(Include.NON_NULL) 但错误仍然存在。
标签: java json hibernate jackson gson