Я работаю с JPA 2.1 (EclipseLink 2.5.1) и JBoss 7.1.@ManyToOne (fetch = FetchType.LAZY) lazy loading not working
Я определить очень простые объекты 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 впрыскивается в управляемом компоненте:
@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());
, потому что «приложение» объект отсоединяется и ленивая загрузка была настроена.
Почему не работает ленивая загрузка?
Благодаря
Попробуйте добавить @Transactional on doSomething() – Xstian
Если getAplicacion() вызывается в отдельном объекте, он должен поднять печально известное исключение LazyInitializationException. Это не ... так приложение все еще прилагается. –
@Xstian - Я пробовал то, что вы предлагали (контекст постоянства транзакций), но у меня тот же результат. – Eduardo