Seguinte… vou apresentar meu cenario:
[size=18]Tenho um projeto JPA (com os meus models)[/size]
ex:
[code]@Entity(name = “Paciente”)
@Table(name = “PACIENTE”)
public class Paciente {
public Paciente() {
patologias = new ArrayList<Patologia>();
patologiasFamilia = new ArrayList<Patologia>();
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Integer id;
@Column(name = "CPF", nullable = false, unique = true)
private String cpf;
@Column(name = "NOME", nullable = false)
private String nome;
@Column(name = "DATA_NASCIMENTO")
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@Column(name = "SEXO")
private Character sexo;
public Character getSexo() {
return sexo;
}
@Column(name = "PRESSAO_SISTOLICA")
private String pressaoSistolica;
@Column(name = "PRESSAO_DIASTOLICA")
private String pressaoDiastolica;
@Column(name = "AVATAR_SRC")
private String srcAvatar;
@OneToOne
@JoinColumn(name = "FK_PACIENTE_BIOTIPO_ID")
private PacienteBiotipo biotipo;
@OneToOne
@JoinColumn(name = "FK_GRUPO_PACIENTE_ID")
private PacienteGrupo grupo;
@OneToOne
@JoinColumn(name = "FK_OBJETIVO_ID")
private PacienteObjetivo objetivo;
@ManyToMany
@JoinTable(name = "PACIENTE_PATOLOGIA", joinColumns = @JoinColumn(name = "FK_PACIENTE_ID"), inverseJoinColumns = @JoinColumn(name = "FK_PATOLOGIA_ID"))
private Collection<Patologia> patologias;
@ManyToMany
@JoinTable(name = "PACIENTE_PATOLOGIA_FAMILIAR", joinColumns = @JoinColumn(name = "FK_PACIENTE_ID"), inverseJoinColumns = @JoinColumn(name = "FK_PATOLOGIA_ID"))
private Collection<Patologia> patologiasFamilia;[/code]
[size=8]Tenho um projeto EJB (onde possui os dao (interfaces e implementacoes)[/size]
[code]public interface DAO extends Repository {
// public T get(Object id) throws Exception;
public void delete(T object) throws Exception;
public void delete(Collection<T> objects) throws Exception;
public void delete(Integer id) throws Exception;
public void add(T t) throws Exception;
public void addOrUpdate(T t) throws Exception;
public void update(T t) throws Exception;
public void refresh(T t) throws Exception;
}[/code]
[code]@Local
public interface DAOPaciente extends DAO {
public Paciente getPacienteByCPF(String cpf) throws Exception;
}[/code]
implementacao:
[code]@Stateless
public class JPAPaciente implements DAOPaciente {
@PersistenceContext
private EntityManager manager;
@Override
public void delete(Paciente object) {
manager.remove(object);
}
@Override
public void delete(Collection<Paciente> objects) {
for (Paciente paciente : objects) {
manager.remove(paciente);
}
}
@Override
public void delete(Integer id) {
manager.remove(id);
}
@Override
public void add(Paciente t) {
manager.persist(t);
}
@Override
public void addOrUpdate(Paciente t) {
Paciente paciente = manager.find(Paciente.class, t);
if (paciente != null) {
manager.merge(paciente);
} else {
manager.persist(t);
}
}
@Override
public void update(Paciente t) {
manager.merge(t);
}
@Override
public void refresh(Paciente t) {
manager.refresh(t);
}
@Override
public Paciente getPacienteByCPF(String cpf) {
TypedQuery<Paciente> query = manager.createQuery(
"SELECT p FROM Paciente p WHERE p.cpf = :cpf", Paciente.class);
query.setParameter(1, cpf);
return query.getSingleResult();
}
@Override
public Collection<Paciente> getAll() {
TypedQuery<Paciente> query = manager.createQuery(
"SELECT p FROM Paciente p", Paciente.class);
return query.getResultList();
}
@Override
public Paciente get(Object id) {
return manager.find(Paciente.class, id);
}
}[/code]
e o EJB
[code]@Stateless
public class PacienteService implements PacienteBusiness {
@EJB
private DAOPaciente dao;
public void add(Paciente paciente) throws Exception {
dao.add(paciente);
}
public void delete(Paciente paciente) throws Exception {
dao.delete(paciente);
}
public void delete(Integer id) throws Exception {
dao.delete(id);
}
@Override
public Collection<Paciente> getAll() {
return dao.getAll();
}
@Override
public Paciente get(Integer id) {
return dao.get(id);
}
@Override
public void refresh(Paciente paciente) {
try {
dao.refresh(paciente);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
Quando estou na pagina JSF que quero mostrar as patologias de um paciente em particular… atraves de uma requisicao get (/paciente?id=2) quando o JSF faz o get de patologias… é jogada uma Exception
Ja entendi que isso ocorre devido o fato do “EntityManager” [injetado no EJB via AS] esta sendo fechado antes da renderizacao da pagina…
A PERGUNTA É: Como manter esse EntityManager aberto durante a renderizacao da pagina???
grato!