我正在尝试在GWT前端使用延迟加载JPA [Hibernate]
在实体
中 @ManyToOne(targetEntity = Item.class,fetch=FetchType.LAZY)
private Item item;
在dao
@Transactional
public List<Purchase> findAllPurchases() {
return jpaTemplate.execute(new JpaCallback<List<Purchase>>(){
public List<Purchase> doInJpa(EntityManager em)
throws PersistenceException {
List<Purchase> list = em.createQuery("select o from Purchase o").getResultList();
for(Purchase p:list){
Item item = p.getItem();
if(item!=null)
item.getItemName();
}
return list;
}
}); }
我收到此错误。
com.google.gwt.user.client.rpc.SerializationException:类型'com.hardwarestore.vo.Item _ $$ _ javassist_0'未包含在可由此SerializationPolicy序列化的类型集中,或者其Class对象可以没有加载。出于安全考虑,此类型不会被序列化:instance = com.hardwarestore.vo.Item@a1eaf6
Purchase类和Item类都实现了Serializable接口。任何形式的帮助表示赞赏。谢谢。
答案 0 :(得分:1)
GWT中的序列化程序无法序列化Collection的Proxy-Object,因为它的Class是在服务器部分的运行时创建的。要序列化反序列化,必须在编译时找到ProxyObject源(我认为)。
据我了解GWT中的序列化过程,你无法进行延迟加载。你必须以这种方式转换你的实体,你创建一个可调用的方法,它通过你的实体的主键从JS加载集合,它包含集合,或者你必须将集合切换到急切加载。
答案 1 :(得分:1)
或者,您可以使用DTO(数据传输对象)。只需将服务器端的持久对象转换为客户端即可。