JPA [Hibernate]懒惰加载GWT问题

时间:2010-12-09 09:42:35

标签: java hibernate gwt jpa

我正在尝试在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接口。任何形式的帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

GWT中的序列化程序无法序列化Collection的Proxy-Object,因为它的Class是在服务器部分的运行时创建的。要序列化反序列化,必须在编译时找到ProxyObject源(我认为)。

据我了解GWT中的序列化过程,你无法进行延迟加载。你必须以这种方式转换你的实体,你创建一个可调用的方法,它通过你的实体的主键从JS加载集合,它包含集合,或者你必须将集合切换到急切加载。

答案 1 :(得分:1)

或者,您可以使用DTO(数据传输对象)。只需将服务器端的持久对象转换为客户端即可。