Mapeamento de dois atributos com campos iguais

0 respostas
paulohbmetal

E aí pessoal, blz?

Seguinte, estou com um problema aqui meio diferente… Tenho um mapeamento hierarquico aqui entre Pessoa (classe mãe), PessoaFisica (classe filha) e PessoaJuridica (classe filha). A classe mãe (Pessoa) está mapeada como @MappedSuperclass pois, aproveitam atributos e também não possuem acesso de escrita na tabela mãe (pessoa), só nas filhas. Até aí tudo bem mas, existe uma outra classe (Socio) que possui dependência com, ou PessoaFisica ou PessoaJuridica. A forma em que o pessoal (o projeto não é meu) mapeou, foi criando as duas propriedades, pois a relação poderia ser com PessoaJuridica ou PessoaFisica (o que achei muito estranho pois, o mapeamento poderia ser só para a classe mãe (Pessoa)). O problema é que no momento da busca, a aplicação buscava uma PessoaJuridica com id de PessoaFisica e vice-versa. Gerando uma exceção de entidade não encontrada.

Daí pensei: pq não utilizar o mapeamento hierarquico JOINED (já que existe a tabela mãe; ao invés de usar o MappedSuperclass), e mapear a dependência diretamente para Pessoa (classe mãe) ao invés de usar as classes filhas. Assim fiz e para consultar funcionou que é uma beleza mas, o problema maior foi na inserção. Como já disse, não temos acesso de escrita à tabela da classe mãe (Pessoa) e a inserção é feita por uma trigger no banco então, quando vamos inserir uma classe filha com o mapeamento JOINED, ocorre a tentativa de inclusão da classe mãe (o que é natural), lançando a exceção de privilégios insuficientes.

A pergunta é: existe alguma forma criar esse mapeamento JOINED e especificar para não incluir a classe mãe?

Seguem as classes com @MappedSuperclass:

@MappedSuperclass
public abstract class Pessoa {

    public Pessoa(TipoPessoaEnum tipoPessoaEnum) {
        this.tipoPessoa = tipoPessoaEnum;
    }

    @Id
    @Column(name = "ID_PESSOA")
    protected int id;

    @Transient
    private String codigoPessoa;

    @Transient
    @Column(name = "TIPO_PESSOA")
    protected TipoPessoaEnum tipoPessoa;

   public boolean isFisica() {
        return tipoPessoa.equals(TipoPessoaEnum.F);
    }

    public boolean isJuridica() {
        return tipoPessoa.equals(TipoPessoaEnum.J);
    }

    //getters and setters
}
@Entity
@Table(name = "PESSOA_FISICA")
public class PessoaFisica extends Pessoa implements Serializable {

    @Column(name = "CPF")
    private String cpf;
    @Column(name = "NOME")
    private String nome;


    //getters and setters
}
@Entity
@Table(name = "PESSOA_JURIDICA")
public class PessoaJuridica extends Pessoa implements Serializable {
	
	public PessoaJuridica() {
	    super(TipoPessoaEnum.J);
	}

	@Column(name = "NUMR_CNPJ")
	private String cnpj;

	@Column(name = "NOME_FANTASIA")
	private String nome;

	//getters and setters
}
@Entity
@Table(name = "SOCIO")
public class Socio {

    @Transient
    public Pessoa getPessoa() {
        if (pessoa.isFisica()) {
            getPessoaFisica();
        } else {
            getPessoaJuridica();
        }

        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_PESSOA", insertable = false, updatable = false)
    private PessoaFisica getPessoaFisica() {
        return pessoa instanceof PessoaFisica ? (PessoaFisica) pessoa : null;
    }

    @SuppressWarnings("unused")
    private void setPessoaFisica(PessoaFisica pessoaFisica) {
        setPessoa(pessoaFisica);
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_PESSOA", insertable = false, updatable = false)
    private PessoaJuridica getPessoaJuridica() {
        return pessoa instanceof PessoaJuridica ? (PessoaJuridica) pessoa : null;
    }

    @SuppressWarnings("unused")
    private void setPessoaJuridica(PessoaJuridica pessoaJuridica) {
        setPessoa(pessoaJuridica);
    }
}

Agora com o JOINED:

@Entity
@Table(name = "PESSOA")
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa {
    public Pessoa(TipoPessoaEnum tipoPessoaEnum) {
        this.tipoPessoa = tipoPessoaEnum;
    }

    @Id
    @Column(name = "ID_PESSOA")
    protected int id;

    @Column(name = "TIPO_PESSOA")
    protected TipoPessoaEnum tipoPessoa;

    //getters and setters
}
@Entity

@Table(name="PESSOA_FISICA")

public class PessoaFisica extends Pessoa {


    @Column(name = "CPF")
    private String cpf;

    @Column(name = "NOME")
    private String nome;


    //getters and setters
}
@Entity

@Table(name="PESSOA_JURIDICA")

public class PessoaJuridica extends Pessoa {

	public PessoaJuridica() {
	    super(TipoPessoaEnum.J);
	}

	@Column(name = "NUMR_CNPJ")
	private String cnpj;

	@Column(name = "NOME_FANTASIA")
	private String nome;

	//getters and setters
}
@Entity
@Table(name = "SOCIO")
public class Socio {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_PESSOA")
    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}

Valeu!

Criado 20 de abril de 2011
Respostas 0
Participantes 1