我正在使用JPA 2.1(EclipseLink 2.5.1)和JBoss 7.1。@ManyToOne(fetch = FetchType.LAZY)延遲加載不起作用
我已經定義很簡單的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 ...
}
我已經開發出一種staless EJB執行一個查詢來獲取一些「Aplicacion」的實體。
@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());
}
}
}
延遲加載甚至沒有工作時延遲加載已經爲「aplicacion」字段定義'Prestacion'實體。之前發佈的,應在下一行返回一個NullPointerException異常代碼:
System.out.println (app.getCodAplicacionV());
,因爲「應用」實體分離,並延遲加載已配置。
爲什麼不工作延遲加載?
感謝
嘗試在doSomething() – Xstian 2014-09-02 18:08:28
上添加@Transactional如果在分離的對象中調用getAplicacion(),則應該引發臭名昭着的LazyInitializationException。這不是......所以應用程序依然存在。 – 2014-09-02 22:04:09
@ Xstian - 我已經嘗試了你的建議(事務持久化上下文),但我得到了同樣的結果。 – Eduardo 2014-09-03 06:20:24