【问题标题】:entitymanager persist实体管理器坚持
【发布时间】:2010-08-04 09:15:52
【问题描述】:

我在尝试更新外键时遇到问题。 使用合并功能时,我总是会遇到内存不足错误,或者我会超时

Fakultaet 和 Standort 是 Raum 表中的外键(多对一,延迟获取) Raum 确实渴望为 Fakultaet 和 Standort 取货

@Stateless
@Local (IRaumHomeLocal.class)
@Remote (IRaumHomeRemote.class)
public class RaumHome implements IRaumHome {
 @PersistenceContext private EntityManager em;

 void merge(Raum r, Integer fid, Integer sid) {
  Fakultaet f = em.find(Fakultaet.class, fid);
  Standort s = em.find(Standort.class, sid);
  r.setFakultaet(f);
  r.setStandort(s);
  f.getRaums().add(r);
  s.getRaums().add(r);
  em.merge(r);
 }
 ....
}

然后我尝试使用 getReference() 而不是 find() 因为我只想进行更新, 所以我有方法:

void merge(Raum r, Integer fid, Integer sid) {
 Standort s = em.getReference(Standort.class, sid);
 Fakultaet f = em.getReference(Fakultaet.class, fid);
 s.getRaums().add(r); // now it lags here
 f.getRaums().add(r);
 em.merge(r);
}

还是不行
之后我删除了 s.getRaums().add(r) 和 f.getRaums().add(r) 行 但这会在我需要执行的下一个查询中导致 LazyInitializationException。

我想要的是这样的:

UPDATE Raum SET FakultaetId = ?, StandortId = ? WHERE RaumID = ?

我做错了什么?有更好的方法吗?

【问题讨论】:

    标签: java jpa ejb-3.0 ejb


    【解决方案1】:

    问题是我已经让所有对象处于分离状态,并且进行查找导致整个对象树再次加载。

    使用em.getReference并没有解决问题,因为访问对象的任何属性都会导致它被加载,所以它和find有同样的问题。

    解决方案是只使用分离的实例
    新的合并函数如下所示:

    void merge(Raum r, Fakultaet f, Standort s) {
     r.setFakultaet(f);
     r.setStandort(s);
     f.getRaums().add(r);
     s.getRaums().add(r);
     em.merge(r);
    }
    

    所有参数都是分离的实例。

    这仍然有问题(至少对我和我的休眠版本 3.2 而言): 合并后分离的对象(r​​aum)没有更新它的版本字段,所以进行新的更新会导致异常,我必须通过增加我的方法中的版本字段来解决这个问题

    void merge(Raum r, Fakultaet f, Standort s) {
     try {
      r.setFakultaet(f);
      r.setStandort(s);
      f.getRaums().add(r);
      s.getRaums().add(r);
      em.merge(r);
      r.setVersion(r.getVersion() + 1);
     }
     catch(RuntimeException re) {
      // logging
      throw re;
     }
    }
    

    这更像是一种 hack,但是......它可以工作,考虑到此代码适用于网站,我找不到更好的解决方案,其中使用分离实例是最好的解决方案(创建对象树需要很多时间时间,我不想为每个请求重新创建所有内容)

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2021-05-06
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多