Problema com JPA + Hibernate

Bom dia pessoal.
Primeiramente feliz natal a todos :smiley:

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

[code]@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;

[/code]

PessoaMail

[code]@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;

[/code]
PessoaMailPK

[code]public class PessoaMailPK implements Serializable {

private static final long serialVersionUID = 7028436891640853454L;

private Integer cPessoa;
private Integer cTipoMail;

[/code]
TipoMail

[code]@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;

[/code]
Controller

[code]List emails = new ArrayList();

emails.add(pessoaMail);
emails.add(pessoaMailNFe);
	
pessoa.setEmails(emails);
	
pessoaFacade.salvar(pessoa);

[/code]

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?

Pessoal, ninguém tem um luz pra mim?

Obrigado

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).

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.