【问题标题】:JPA[Hibernate] Lazy-loading with GWT problemJPA[Hibernate] 延迟加载与 GWT 问题
【发布时间】:2023-11-09 16:21:01
【问题描述】:

我正在尝试将延迟加载 JPA[Hibernate] 与 GWT 前端一起使用

在实体中

 @ManyToOne(targetEntity = Item.class,fetch=FetchType.LAZY)
 private Item item;

在道

 @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 序列化的类型集中或其类对象可以不被加载。出于安全考虑,此类型不会被序列化。: instance = com.hardwarestore.vo.Item@a1eaf6

Purchase 类和 Item 类都实现了 Serializable 接口。任何形式的帮助表示赞赏。谢谢。

【问题讨论】:

标签: java hibernate gwt jpa


【解决方案1】:

或者,您可以使用 DTO(数据传输对象)。只需在服务器端转换持久化的对象,然后再将其发送到客户端。

【讨论】:

  • 是的,深度克隆似乎是目前唯一的方法。我想做的最后一件事。
  • 但是 GWT 让我们回到 DTO 时代不是很糟糕吗?
【解决方案2】:

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

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

【讨论】: