Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

E se eu quiser persistir o Cliente na Conta e não o contrário?

Implementei o código como visto no vídeo e deu tudo certo. Mas, se eu tento criar o cliente primeiro, adicioná-lo a conta e persistir a conta, o relacionamento não é refletido no banco.

Já tentei criar o relacionamento OneToOne também na conta informado um MappedBy e mesmo assim não funcionou. Alguma dica?

Não seria interessante que a relação fosse preenchida caso eu inserisse um dos dois objetos, referenciando o outro?

Segue abaixo o código das minhas classes Conta e Cliente:

package br.com.mmorais.financas.modelo;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

@Entity
public class Conta {


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @OneToOne(mappedBy="conta")
    private Cliente titular;

    private String numero;
    private String banco;
    private String agencia;

    @OneToMany(mappedBy="conta")
    private List<Movimentacao> movimentacoes;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Cliente getTitular() {
        return titular;
    }
    public void setTitular(Cliente titular) {
        this.titular = titular;
    }
    public String getNumero() {
        return numero;
    }
    public void setNumero(String numero) {
        this.numero = numero;
    }
    public String getBanco() {
        return banco;
    }
    public void setBanco(String banco) {
        this.banco = banco;
    }
    public String getAgencia() {
        return agencia;
    }
    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }    

    public List<Movimentacao> getMovimentacoes() {
        return movimentacoes;
    }
    public void setMovimentacoes(List<Movimentacao> movimentacoes) {
        this.movimentacoes = movimentacoes;
    }
}
package br.com.mmorais.financas.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Entity
public class Cliente {


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String nome;
    private String profissao;
    private String endereco;

    @JoinColumn(unique=true)
    @OneToOne
    private Conta conta;

    public Cliente() {

    }
    public Cliente(String nome, String profissao, String endereco) {
        super();
        this.nome = nome;
        this.profissao = profissao;
        this.endereco = endereco;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getProfissao() {
        return profissao;
    }
    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }
    public String getEndereco() {
        return endereco;
    }
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    public Conta getConta() {
        return conta;
    }
    public void setConta(Conta conta) {
        this.conta = conta;
    }
}
2 respostas

Para conseguir o que você quer , deve configurar o Cascade nos relacionamentos.

@JoinColumn(unique=true)
 @OneToOne( cascade = CascadeType.ALL, orphanRemoval = true)
private Conta conta;

Isso fará que ao persistir o CLIENTE , a CONTA associada também seja PERSISTIDA,ATUALIZADA e REMOVIADA, mas o contrário não é verdade , por quê o cascade só está definido de CLIENTE -> CONTA, caso também queria esse outro comportamento é só configurar.

Para maiores detalhes

https://dzone.com/articles/beginner%E2%80%99s-guide-jpa-and

solução!

Obrigado pela dica Breno. Mas, o meu problema não era com o cascade... o que matou a charada foi o link que passou para maiores detalhes. Ao que parece, preciso setar a relação nas duas pontas. Então, mudei o meu setTitular() na classe Conta para o seguinte:

    public void setTitular(Cliente titular) {
        this.titular = titular;
        titular.setConta(this);
    }

Desse modo, crio o vínculo entre os objetos na hora de inserir a informação e tudo funcionou bem. É que eu achei que o JPA faria isso sozinho... mas foi um bom aprendizado.

Obrigadão.