Salve Gujeiros!
Seguinte:
Tenho duas classes: Pessoa e PessoaEmail
Pessoa
[code]@Entity
@NamedQueries({
@NamedQuery(name=“getClientes”, query=“from Pessoa order by idPessoa”),
)
@Table(name = “pessoa”, schema = “public”)
@SequenceGenerator(name=“PESSOA_SEQ”, sequenceName=“pessoa_id_pessoa_seq”, allocationSize=1)
public class Pessoa implements java.io.Serializable {
@UIHiddenField(column = 10, line = 0)
@Id
@Column(name = "id_pessoa", unique = true, nullable = false, length = 14)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PESSOA_SEQ")
public Integer getIdPessoa() {
return this.idPessoa;
}
public void setIdPessoa(Integer idPessoa) {
this.idPessoa = idPessoa;
}
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "cliente")
public Cliente getCliente() {
return this.cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pessoa", cascade = CascadeType.ALL)
public List<PessoaEmail> getPessoaEmails() {
return this.pessoaEmails;
}
public void setPessoaEmails(List<PessoaEmail> pessoaEmails) {
this.pessoaEmails = pessoaEmails;
}
}[/code]
PessoaEmail
[code]@Entity
@Table(name = “pessoa_email”, schema = “public”, uniqueConstraints = @UniqueConstraint(columnNames = “email”))
@SequenceGenerator(name=“PESSOA_EMAIL_SEQ”, sequenceName=“pessoa_email_id_pessoa_email_seq”, allocationSize=1)
public class PessoaEmail implements java.io.Serializable {
@Id
@Column(name = "id_pessoa_email", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PESSOA_EMAIL_SEQ")
public int getIdPessoaEmail() {
return this.idPessoaEmail;
}
public void setIdPessoaEmail(int idPessoaEmail) {
this.idPessoaEmail = idPessoaEmail;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "pessoa", nullable = false)
public Pessoa getPessoa() {
return this.pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
}
[/code]
Tenho o seguinte método que lê os dados de um txt e salva a entidade Pessoa e a entidade PessoaEmail.
[code]public Boolean importaEmails(String arquivoFonte) {
PessoaRepository pr = BeanFactory.getPessoaRepository(em);
while ((registro = readRegistro()) != null) {
boolean atualizar = false;
// busca pessoa no banco
Pessoa p = pr.getPessoaFisicaJuridica(registro[1]);
List<PessoaEmail> pessoaEmail = null;
// busca List<PessoaEmail> do relacionamento @OneToMany
pessoaEmail = p.getPessoaEmails();
if (pessoaEmail != null && pessoaEmail.size() > 0){
temEmailCadastrado = true;
}
if (temEmailCadastrado) {
atualizar = true;
}
if (!atualizar) {
PessoaEmail pm = new PessoaEmail();
pm.setNome("nfe");
pm.setEmail(registro[2]);
pm.setPessoa(p);
if (salva(pm)) {
logger.debug("Email importado: " + registro[1]);
} else {
logger.debug("Erro ao gravar Pessoa: " + registro[1]);
}
} else {
PessoaEmail pm = pessoaEmail.get(0);
pm.setEmail(registro[2]);
em.getTransaction().begin();
PessoaEmail pessoaEmailRet = em.merge(pm);
em.getTransaction().commit();
if (pessoaEmailRet != null) {
logger.debug("Email atualizado: " + registro[2]);
} else {
logger.debug("Erro ao atualizar PessoaEmail: " + registro[1]);
}
}
}
fecha();
return Boolean.TRUE;
}
public boolean salva(Object arg){
try{
tx.begin();
em.persist(arg);
tx.commit();
}
catch (Exception e){}
}
[/code]
O problema é que durante a importação, o método p.getPessoaEmails(); não retorna a List.
Mas se após a importação eu chamar o método novamente, ele retorna a lista normalmente.
Isto seria um problema do hibernate?
Do EntityManager?
Já fiz alterações de EAGER e LAZY nos relacionamentos porém não obtive sucesso.
Se alguém puder ajudar, agradeço.
Abraços.