Olá pessoal!
Eu tenho uma pessoa que tem endereço e o id de pessoa que é chave extrangeira em endereço faz parte da chave primária de endereço (ou seja endereço fica com chave múltipla e uma das chaves é FK)… como eu faço para gerar o id de endereço sendo que ele vai depender do id de pessoa? Eu sei que eu poderia pesquisar o último id de endereco e depois acrescentar mais 1 diretamente pelo sql… mas acho que fica feio desse jeito né? Confiram também por favor se o mapeamento está ok?
exemplo:
public class Pessoa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="IDPessoa")
private Long idPessoa;
// getters e setters / hashcode e equals
}
@Entity
@Table(name="tb_endereco")
public class Endereco implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EmbeddedId
private EnderecoPK enderecoPK;
// getters e setters / hashcode e equals
@Embeddable
public class EnderecoPK implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name="idPessoa")
private Pessoa pessoa;
private Long idEndereco;
// getters e setters / hashcode e equals
Muito obrigado!
cara,
da uma olhada nesse post, tem o que vc quer.
t+
blz, o post ajudou e deu certo, porém ainda existe um problema… ![:slight_smile: :slight_smile:](//www.guj.com.br/images/emoji/twitter/slight_smile.png?v=5)
Esta Pessoa poderá ter vários telefones… e agora eu tenho uma lista de telefones em pessoa… e também a pk de pessoa fará parte da chave composta de telefone… onde vai ter como chave composta (idTelefone e idPessoa, onde idPessoa é chave extrangeira)
Neste caso eu mapeei de maneira igual, porém colocando oneToMany e ManyToOne do lado inverso… problema: Está salvando apenas um telefone… seria importante salvar mais de um já que é uma lista…
alguma ideia do que possa ser?
public class Pessoa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="IDPessoa")
private Long idPessoa;
private String nome;
private String sexo;
private Date dataNascimento;
private String numeroRG;
private String numeroCPF;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "enderecoPK.pessoa", fetch = FetchType.LAZY)
private Endereco endereco;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "telefonePK.pessoa", fetch = FetchType.LAZY)
private Set<Telefone> telefones;
[code]
public class Telefone implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EmbeddedId
private TelefonePK telefonePK;
private String ddd;
private String numero;[/code]
[code]@Embeddable
public class TelefonePK implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name="idPessoa")
private Pessoa pessoa;
@Basic(optional = false)
@Column(name = "idTelefone", nullable = false)
private Long idTelefone;
}[/code]
valeu!!
cara,
vc realmente precisa na sua tabela de telefone, que idPessoa seja PK, não pode ser somente FK?
vou te passar um exemplo
import java.io.Serializable;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
/**
* The persistent class for the teste2 database table.
*
*/
@Entity
@Table(name="teste2")
public class Teste2 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer idteste2;
private String nome;
//bi-directional many-to-one association to Teste1
@OneToMany(mappedBy="teste2", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Teste1> teste1s;
public Teste2() {
this.teste1s = new ArrayList<Teste1>();
}
public Integer getIdteste2() {
return this.idteste2;
}
public void setIdteste2(Integer idteste2) {
this.idteste2 = idteste2;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Teste1> getTeste1s() {
return this.teste1s;
}
public void setTeste1s(List<Teste1> teste1s) {
this.teste1s = teste1s;
}
}
package br.com.bingo.entity;
import java.io.Serializable;
import javax.persistence.*;
/**
* The persistent class for the teste1 database table.
*
*/
@Entity
@Table(name="teste1")
public class Teste1 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idteste1;
private String nome;
//bi-directional many-to-one association to Teste2
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="teste2")
private Teste2 teste2;
public Teste1() {
}
public int getIdteste1() {
return this.idteste1;
}
public void setIdteste1(int idteste1) {
this.idteste1 = idteste1;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Teste2 getTeste2() {
return this.teste2;
}
public void setTeste2(Teste2 teste2) {
this.teste2 = teste2;
}
}
EntityManager entityManager = Persistence.createEntityManagerFactory("PersistUnit").createEntityManager();
Teste2 teste2 = new Teste2();
teste2.setNome("teste2");
Teste1 teste11 = new Teste1();
teste11.setNome("teste11");
teste11.setTeste2(teste2);
Teste1 teste12 = new Teste1();
teste12.setNome("teste12");
teste12.setTeste2(teste2);
teste2.getTeste1s().add(teste11);
teste2.getTeste1s().add(teste12);
entityManager.getTransaction().begin();
entityManager.persist(teste2);
entityManager.getTransaction().commit();
espero q te ajude
t+
Muito obrigado pela ajuda, porém o idPessoa em telefone, precisa fazer parte da chave composta e também deve ser FK.
Cheguei a fazer o mapeamento só que inseriu 1 pessoa e 1 telefone só… faltou inserir 2 tels!
vlw!!
posta ai o q vc fez, para te dar uma ajudada.
t+
Esse é o código que estou testando pelo junit… ele chega a criar blz… só que não cria o segundo telefone que está na lista!
[code] Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.DAY_OF_MONTH, 27);
calendar.set(Calendar.MONTH, 2);
calendar.set(Calendar.YEAR, 1985);
pessoa = new Pessoa();
pessoa.setNome("Thiago Prudente");
pessoa.setNumeroCPF("06-03");
pessoa.setNumeroRG("45941");
pessoa.setDataNascimento(calendar.getTime());
pessoa.setSexo("M");
pessoa = pessoaDAO.save(pessoa);
assertNotNull("Pessoa existe OK!",pessoa.getIdPessoa());
pessoa = new Pessoa();
pessoa.setNome("Thiago Prudente");
pessoa.setNumeroCPF("06-03");
pessoa.setNumeroRG("45941");
pessoa.setDataNascimento(calendar.getTime());
pessoa.setSexo("M");
Endereco endereco = new Endereco();
endereco.setBairro("olinda");
endereco.setCep("38055400");
endereco.setCidade("Uberaba");
endereco.setComplemento("apto: 04");
endereco.setNomeLogradouro("rua: sem saida");
endereco.setNumero("278");
endereco.setTipoLogradouro("ap");
endereco.setEnderecoPK(new EnderecoPK());
endereco.getEnderecoPK().setPessoa(pessoa);
List<Telefone> telefones = new ArrayList<Telefone>();
TelefonePK telefonePK = new TelefonePK();
telefonePK.setPessoa(pessoa);
Telefone telefone = new Telefone();
telefone.setDdd("034");
telefone.setNumero("12345678");
telefone.setTelefonePK(telefonePK);
telefones.add(telefone);
telefone = new Telefone();
telefone.setDdd("034");
telefone.setNumero("9989545");
telefone.setTelefonePK(telefonePK);
telefones.add(telefone);
pessoa.setEndereco(endereco);
pessoa.setTelefones(telefones);
pessoa = pessoaFisicaDAO.save(pessoa);
assertNotNull("Pessoa e endereco foram criados OK! ",pessoa.getEndereco());[/code]
cara,
posta as suas entidades, pessoa e telefone tbm
t+
[quote=ThiagoWorldCoder]blz, o post ajudou e deu certo, porém ainda existe um problema… ![:slight_smile: :slight_smile:](//www.guj.com.br/images/emoji/twitter/slight_smile.png?v=5)
Esta Pessoa poderá ter vários telefones… e agora eu tenho uma lista de telefones em pessoa… e também a pk de pessoa fará parte da chave composta de telefone… onde vai ter como chave composta (idTelefone e idPessoa, onde idPessoa é chave extrangeira)
Neste caso eu mapeei de maneira igual, porém colocando oneToMany e ManyToOne do lado inverso… problema: Está salvando apenas um telefone… seria importante salvar mais de um já que é uma lista…
alguma ideia do que possa ser?
public class Pessoa implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="IDPessoa")
private Long idPessoa;
private String nome;
private String sexo;
private Date dataNascimento;
private String numeroRG;
private String numeroCPF;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "enderecoPK.pessoa", fetch = FetchType.LAZY)
private Endereco endereco;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "telefonePK.pessoa", fetch = FetchType.LAZY)
private Set<Telefone> telefones;
[code]
public class Telefone implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EmbeddedId
private TelefonePK telefonePK;
private String ddd;
private String numero;[/code]
[code]@Embeddable
public class TelefonePK implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name="idPessoa")
private Pessoa pessoa;
@Basic(optional = false)
@Column(name = "idTelefone", nullable = false)
private Long idTelefone;
}[/code]
valeu!![/quote]
postado!
cara,
num projeto tenho essa situação como a sua, a unica coisa diferente é aqui na classe PK
@JoinColumn(name = "CHAVE_FK", referencedColumnName = "CHAVE_PK", insertable = false, updatable = false)
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
ve te ajuda ai.
t+
Nesse post tem um exemplo de Mapeamento que eu acredito ser a sua dúvida.
@OneToMany e @ManyToOne Unidirecional e Bidirecional