【发布时间】:2014-09-02 14:53:50
【问题描述】:
我正在使用 JPA 2.1 (EclipseLink 2.5.1) 和 JBoss 7.1。
我已经定义了非常简单的 JPA 实体:
@Entity
@Table(name="APLICACIONES_TB")
public class Aplicacion implements Serializable {
@Id
@Column(name="COD_APLICACION_V")
private long codAplicacionV;
@Column(name="APLICACION_V")
private String aplicacionV;
@OneToMany(mappedBy="aplicacion")
private Collection<Prestacion> prestaciones;
... getters and setters
}
@Entity
@Table(name="PRESTACIONES_TB")
public class Prestacion implements Serializable {
@Id
@Column(name="COD_PRESTACIONES_V")
private String codPrestacionesV;
@Column(name="DESCRIPCION_V")
private String descripcionV;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "COD_APLICACION_V")
private Aplicacion aplicacion;
... getters and setters ...
}
我开发了一个过时的 EJB,它执行查询以获取一些“应用程序”实体。
@Stateless
@LocalBean
public class DocuEJB implements DocuEJBLocal
{
@PersistenceContext(name="DocuEjb", type=PersistenceContextType.TRANSACTION)
private EntityManager em;
public Prestacion getResult(String name)
{
return em.createNamedQuery("ExampleQueryName", Prestacion.class).getSingleResult();
}
}
因为我使用的是 JSF 2.1,所以 EJB 被注入到托管 bean 中:
@ManagedBean(name = "ManagedBean")
@RequestScoped
public class ManagedBean
{
@EJB DocuEJB docuEjb;
public String doSomething()
{
Prestacion entity = docuEjb.getResult("egesr");
if (entity != null)
{
// It should return null because 'entity' should be detached
Aplicacion app = entity.getAplicacion();
// but 'app' entity is not null, ¿why not?
System.out.println (app.getCodAplicacionV());
}
}
}
即使为“Prestacion”实体上的“aplicacion”字段定义了延迟加载,延迟加载也不起作用。之前发布的代码应该在下一行返回 NullPointerException:
System.out.println (app.getCodAplicacionV());
因为 'app' 实体已分离且已配置延迟加载。
为什么延迟加载不工作?
谢谢
【问题讨论】:
-
尝试在 doSomething() 上添加@Transactional
-
如果在分离的对象中调用 getAplicacion(),它应该引发臭名昭著的 LazyInitializationException。不是...所以应用程序仍然附加。
-
@Xstian - 我已经尝试过你的建议(事务持久性上下文),但我得到了相同的结果。
-
@Ivan.aguirre - 但它不能附加,因为我在 ejb 中使用事务持久性上下文,所以当 ejb 方法完成时,持久性上下文是清晰的,所有实体都被分离。我在所有 JPA 书籍中都读过这一点
-
我在互联网上读到,即使实体已分离,惰性链接也可以与 EclipseLink 提供程序一起使用。在这种情况下,EclipseLink 将简单地从连接池中获取一个只读连接,执行加载,然后将连接放回池中。我在下一个链接中读到了这个:softaria.com/2011/07/26/eclipselink-versus-hibernate。但我想在 EclipseLink 文档中找到这个解释。
标签: jpa eclipselink lazy-loading