FetchType e BagCollections

0 respostas
sunwebdeveloper

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 !!!

Criado 9 de junho de 2010
Respostas 0
Participantes 1