Hibernate: Meu Object Precisa ser um ID

9 respostas
A

Pessoa estou com um problema que ja tentei resolver, mas so funciona o modelo “paralelo” .
Irei passar os fontes resumidos.
Eu tenho 2 tabelas:
PessoaFisica e PessoaResidencial

[ PessoaFisica ]   <Table>
  id <Column>  <PK> 
  nome          <Column>
  
  ---------------------------
  
  [ PessoaResidencial ]   <Table>
  id        <Column>  <PK>  <FK -> id [ PessoaFisica ] &gt
  endereco            <Column>

Estou mapeando a minhas classes assim:
PessoaFisica.java

@Entity
public class PessoaFisica {
    @Id
    @GeneratedValue
    private Integer id;
    
    private String nome;
    
    @OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "id") // mapeamento para a tabela PessoaResidencial e coluna ID.
    private PessoaResidencial pessoaResidencial;
    
    // geters e setters omitidos.

PessoaResidencia.java

@Entity
public class PessoaResidencia {
    
    @Id
    @OneToOne(cascade = {}, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID")
    private PessoaFisica id;
    
    private String nome;

Mais assim da erro. Gostaria de saber se estou fazendo errado.


Eu sei se eu criar mais 1 coluna(ID_NOVO) na tabela PessoaResidencial como chave primaria e mapear assim:

@Entity
public class PessoaResidencia {
    
    @Id
    @GeneratedValue
    private Integer id_novo;
    
    @OneToOne(cascade = {}, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID")
    private PessoaFisica id;
	
    private String nome;

Funciona perfeitamente.Mas infelizmente nao posso alterar a tabela.

Consegui ser Claro?

[]'s a todos…

9 Respostas

A

Eu preciso adicionar os 2 com o mesmo ID.
E gostaria de usar assim:

PessoaFisica pf = new PessoaFisica ();

       factory.beginTransaction();

       factory.add(pf);
       
       factory.commit();
       factory.close();

PessoaResidencial pr = new PessoaResidencial ();
pr.setId(pf); // Aqui pegaria o ID gerado anteriormente.
       factory.beginTransaction();

       factory.add(pr);
       
       factory.commit();
       factory.close();
A vantagem disso tudo, é que depois para eu popular meu formulario no jsp. Posso fazer assim:
PessoaFisica pf = new PessoaFisica ();
pf.setId(1122)

       factory.beginTransaction();

       factory.refresh(pf); // usando o refresh 
       
       factory.commit();
       factory.close();
Pegaria todos os dados de pessoa fisica com o id 1122 e seu endereco, cidade, cep e etc...
A

Alguem ajuda??
O sistema esta funcinando, porem o interessante era eu fazer-lo funcionar certo , neh…

[]'s

A

Fala velho,

Quando vc chama o save no hibernate, ele retorna o id criado para o registro. Pega esse id e usa no seu outro objeto.

EX:

PessoaFisica pf = new PessoaFisica();
 Long id = hibernateSession.save(pf);

 PessoaResidencial pr = new PessoaResidencial ();
 pr.setId(id); // Aqui pegaria o ID gerado anteriormente.

Alberto

A

Estou usando exatamente assim.
Mas gostaria de deixar um relacionamento forte entre os 2.
Entendeu?
Por exemplo quando eu chamar:

PessoaFisica pf = new PessoaFisica(); Long id = hibernateSession.save(pf); hibernateSession.refresh(pf)

J

afsrj:
Estou usando exatamente assim.
Mas gostaria de deixar um relacionamento forte entre os 2.
Entendeu?
Por exemplo quando eu chamar:

PessoaFisica pf = new PessoaFisica(); Long id = hibernateSession.save(pf); hibernateSession.refresh(pf)

Caro colega, para mapear da forma desejada é necessário que você tenha um objeto para sua super classe na classe filha desejada e a seguinte anotação: @PrimaryKeyJoinColumn(name=“pessoa_id”), sendo que na classe filha NÃO deve haver notação @Id.

A

Amigo, o caso é que nao tenho uma super classe para pessoa residencial.

Eu essa anotacao para os casos de sub e super class sim.

J

afsrj:
Amigo, o caso é que nao tenho uma super classe para pessoa residencial.

Eu essa anotacao para os casos de sub e super class sim.

Pelo que você mandou pessoaresidencial é uma estensão de Pessoa Física ,ou estou enganado?

A

Não é nao.

Para ser extends(heranca) so se for o caso de a é um ou é uma b.

Neste caso não é.

Fabio_Kung

esse é o OneToOne por chave primária (a outra opção seria OneToOne por chave estrangeira, que é o que você está tentando fazer).

Dá uma olhada aqui: http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e959
O primeiro exemplo é o que você procura, com a anotação @PrimaryKeyJoinColumn.

Criado 20 de dezembro de 2006
Ultima resposta 5 de jan. de 2007
Respostas 9
Participantes 4