Bom Dia amigos…
Estou começando minha primeira aplicação 100% JPA e como todo início algumas dúvidas estão surgindo…
A do momento é a seguinte:
Em minha modelagem possuo a relação Paciente 1------N Observações
representado abaixo.
Paciente:
@Entity
@Table(name = "paciente")
public class PacienteBean implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer codigo;
@OneToMany(mappedBy="paciente")
private List<ObservacaoPacienteBean> observacoes;
Observação:
@Entity
@Table(name="observacao")
public class ObservacaoPacienteBean implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@ManyToOne
private PacienteBean paciente = new PacienteBean();
Pois bem, minha dúvida é a seguinte: Como por default as associações são LAZY, quando carrego um paciente:
try{
paciente = (PacienteBean)daoFactory.getPacienteDAO().load(1);
}catch(Exception e){
throw new RunTimeException(e.getMessage());
}
a respectiva List não é carregada(somente quando executo seu respectivo get) até aí tudo bem… por se tratar de uma aplicação web, utilizo VRaptor como front-controller e criei um interceptor(Filter servlet) que injeta meu DAOFactory em cada logic com o objetivo de manter a session aberta no momento que renderizo o JSP, pois nele possuo uma displaytag que mostra todas as observações do paciente:
Interceptador(Filter):
public void intercept(LogicFlow flow) throws LogicException, ViewException {
flow.execute();
if(daoFactory.hasTransaction()){
daoFactory.rollback();
}
daoFactory.close();
}
Mas o que está acontecendo é que em determinados momentos eu atribuo no scopo session um objeto Paciente para utilização futura(sem carregar a lista de Observacoes) e quando vou utiliza-lo uma LazyException é lançada… pelo que entendi(não sei se estou correto) isso se deve por o objeto Paciente ser desatachado de uma session do Hibernate e por isso perde sua ligação impossibilitando fazer a relação). Como uma solução nada elegante, quando eu preciso mostrar a lista de observações eu pego o objeto do escopo session e dou novamente um load nele :
try{
paciente = (PacienteBean)daoFactory.getPacienteDAO().load(1);
}catch(Exception e){
throw new RunTimeException(e.getMessage());
}
causando mais uma requisição a base… mas queria evitá-lo !!!
Existe algum pattern ou boa prática para lidar com essa situação ??? Espero ter sido claro hahahahha
Obrigado !!!