Problema em mais de um relacionamento com a mesma entidade JPA + Hibernate

2 respostas
Jhoseph_Araujo

salve salve galera do guj boa noite, estou com um probleminha aki com meu programa que é o seguinte.
tenho as seguintes tabelas no banco:

estou utilizando o JPA + Hibernate para salvar no banco. Minha classe mapeada esta assim.

Classe endereco:

@Entity @Table(name = "endereco") public class Endereco { ... @OneToOne(cascade=CascadeType.ALL) private Paciente paciente; ... }

Classe solicitacao:

@Entity @Table(name = "solicitacao") public class Solicitacao{ ... @OneToOne(cascade=CascadeType.ALL) private Paciente paciente; ... }

Dessa forma eu consigo gravar no banco normalmente, só que ele salva os dados do paciente replicados. Salva uma vez para o endereço e outra para solicitação, no caso, teria que salvar um paciente e as demais informações nas outras tabelas, mais uma coisa, as informações para serem persistidas ficam todas no mesmo formulário. Alguem aí já passou por isso ou tem alguma ideia de como possa resolver??

Att

2 Respostas

Jhoseph_Araujo

Ninguem :frowning:

caio.ribeiro.pereira

Há um errinho no seu mapeamento.

A sua classe paciente precisa ter o @OneToOne(mappedBy=“paciente”, cascade=CascadeType.ALL) e nas classes Endereço e Solicitação apenas @OneToOne.

Pois o atributo mappedBy dirá ao Hibernate que a entidade Paciente manda no relacionamento OneToOne ou seja salvou o paciente com endereco e solicitacao, já será salvo tudo em apenas um registro de paciente, assim como o cascade que no seu caso precisa ficar no paciente pois você salva um paciente que já vem com ele um endereco e solicitacao e nao o inverso, veja o código abaixo…

public class Paciente {

     @OneToOne(mappedBy="paciente", cascade=CascadeType.ALL)
     private Solicitacao solicitacao;

     @OneToOne(mappedBy="paciente", cascade=CascadeType.ALL)
     private Endereco endereco;     
    
     ...
}

Obs.: todo mappedBy precisa ser em minúsculo, pois neste caso, ela esta se referenciando ao atributo paciente da classe Endereco e Solicitacao e nao a própria classe Paciente.

public class Endereco {

      @OneToOne
      public Paciente paciente;
}
public class Solicitacao {

      @OneToOne
      public Paciente paciente;
}
Criado 20 de novembro de 2011
Ultima resposta 22 de nov. de 2011
Respostas 2
Participantes 2