Problema com JPA + Hibernate

3 respostas
F

Bom dia pessoal.
Primeiramente feliz natal a todos :D

Estou com um problema ao persistir uma tabela pai com uma tabela filha.
Estou utilizando JPA com provider Hibernate 4.3 Final.

Tenho uma Entity chamada Pessoa(pai) e outra PessoaMail(filha).

Consigo persistir normalmente a Pessoa mas quando persisto a filha, esta me dando erro.

Pessoa
@Entity
@Table(name = "PESSOA", schema = Configuracao.SCHEMA)
public class Pessoa extends GenericLoggerEntity implements Serializable {

	private static final long serialVersionUID = -8391088907076552464L;

	@Id
	@Column(name = "CPESSOA", precision = 10)
	@SequenceGenerator(name="Pessoa_ID_Seq", sequenceName="S_ID_Pessoa", allocationSize = 1, initialValue = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="Pessoa_ID_Seq")
	private Integer cPessoa;
	
	@TamanhoMinMax(minimo = 3, maximo = 20)
	@Column(name = "FANTASIA", length = 20)
	private String fantasia;
	
	@Column(name = "RAZAO", length = 50)
	private String razao;
	
	@Column(name = "CNPJ", length = 14, unique = true)
	private String cnpj;
	
	@Column(name = "TELEFONE", length = 30)
	private String telefone;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cPessoa", cascade = CascadeType.PERSIST)
	private List<PessoaMail> emails;
PessoaMail
@Entity
@Table(name="PESSOAMAIL", schema = Configuracao.SCHEMA)
@IdClass(PessoaMailPK.class)
public class PessoaMail extends GenericLoggerEntity implements Serializable {

	private static final long serialVersionUID = 4377978914861200882L;

	@Id
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = Pessoa.class)
	@JoinColumn(name = "CPESSOA")
	private Pessoa cPessoa;
	
	@Id
	@ManyToOne(fetch = FetchType.EAGER, targetEntity = TipoMail.class)
	@JoinColumn(name = "CTIPOMAIL")
	private TipoMail cTipoMail;
	
	@Column(name = "EMAIL", nullable = false)
	private String email;
PessoaMailPK
public class PessoaMailPK implements Serializable {

	private static final long serialVersionUID = 7028436891640853454L;

	private Integer cPessoa;
	private Integer cTipoMail;
TipoMail
@Entity
@Table(name="TIPOMAIL", schema = Configuracao.SCHEMA)
public class TipoMail implements Serializable {
	
	private static final long serialVersionUID = -6825850658538609140L;

	@Id
	@Column(name = "CTIPOMAIL")
	private Integer cTipoMail;
	
	@Column(name ="DTIPOMAIL", length = 50)
	private String dTipoMail;
Controller
List<PessoaMail> emails = new ArrayList<PessoaMail>();
			
	emails.add(pessoaMail);
	emails.add(pessoaMailNFe);
		
	pessoa.setEmails(emails);
		
    pessoaFacade.salvar(pessoa);
Quando eu persisto, o hibernate gera o insert da pessoa, que está correto:
2013-12-25T11:58:03.263-0200|Informações: Hibernate: 
    /* insert Pessoa
        */ insert 
        into
                PESSOA
            (LOGIN_ALTERACAO, LOGIN_CRIACAO, ULTIMA_ALTERACAO, CNPJ, FANTASIA, RAZAO, CPESSOA) 
        values
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Mas depois ele faz este insert:
2013-12-25T11:58:03.269-0200|Informações: Hibernate: 
    /* insert TipoMail
        */ insert 
        into
            TIPOMAIL
            (DTIPOMAIL, CTIPOMAIL) 
        values
            (?, ?)

Este insert da erro de chave primaria.
Não quero que ele faça este insert, não sei porque ele fez, o correto seria fazer o insert na PessoaMail e não em TipoMail.

Alguém já passou por isso e pode me ajudar?

3 Respostas

F

Pessoal, ninguém tem um luz pra mim?

Obrigado

Polverini

opa feliz natal pra vc tbm !!!

Cola o stacktrace do erro aqui.

Se não me engano o JPA não aceita duas anotações @Id, faça assim:

Classe PK:

@Embeddable
public class PessoaMailPK  implements Serializable {

@ManyToOne(fetch = FetchType.EAGER, targetEntity = Pessoa.class)  
@JoinColumn(name = "CPESSOA")  
private Pessoa cPessoa;  

@ManyToOne(fetch = FetchType.EAGER, targetEntity = TipoMail.class)  
@JoinColumn(name = "CTIPOMAIL")  
private TipoMail cTipoMail;  

get, set, equals e hashcode

Classe PessoaMail

@Entity  
@Table(name="PESSOAMAIL", schema = Configuracao.SCHEMA)  
public class PessoaMail extends GenericLoggerEntity implements Serializable {  
 
private static final long serialVersionUID = 4377978914861200882L;  
  
@EmbeddedId
private PessoaMailPK pk;  

...... continua classe.

Acho que funciona da uma testada ai (y).

D

Então vou dar meu palpite… talvez eu esteja falando besteira…

mas pelo que vi o Objeto PESSOA é quem manda na relação das suas entidades…

então você não vai conseguir salvar E-mails se não existe o pessoa na base…

tente salvar o pessoa numa transação e depois tente salvar os e-mails em uma nova transação e veja o que acontece.

Criado 25 de dezembro de 2013
Ultima resposta 30 de dez. de 2013
Respostas 3
Participantes 3