1
resposta

Mapeamento complicado de se fazer

Olá galera. Eu tenho um caso muito difícil e interessante. Estou com um BD em produção, e precisei mapeá-lo via hibernate. Resultado: Tenho para uma tabela, uma chave composta por 6 campos.

Agora eu tenho que relacionar a uma outra tabela, onde a relação não existe no esquema do BD.

A tabela MRP está assim:

@Entity
@Table(name = "MRP")
public class MRP implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private MRPId id;

E a chave dela é a Classe MRPId (que não existe no banco. O que existe são os campos que compõe essa chave).:

@Embeddable
public class MRPId implements Serializable{

    @Column(name= "EMPRESA")
    private String empresa;

    @Column(name= "PROJETO")
    private String projeto;

    @Column(name= "REFERENCIA")
    private String referencia;

    @Column(name= "PANTONE")
    private String pantone;

    @Column(name= "DATA")    
    private Date data ;

    @Column(name= "SEQ_MRP")
    private BigDecimal sequenciaMRP;

O problema é que existe (não no banco) uma relação do atributo "projeto" com a entidade :

@Entity
@Table(name="PROJETO")
public class Projeto {
    @Id    
    @Column(name="COD_PROJETO")
    @OneToMany//(mappedBy = "projeto")
    private List<MRP> mrps ;//= new LinkedList<>();

Como mapear essa bagunça?

Lembrando que um PROJETO tem vários MRPs e um MRP tem um Projeto.

1 resposta
insira seu código aqui

Olá, pelo que entendi você criou o mapeamento a partir de uma tabela já existe no banco, certo ?

Seguindo esta idéia acredito que o melhor seria você refazer esses modelos e mapea-los de forma correta. A primeira vista você tem um campo em sua tabela SEQ_MRP, este item acredito ser o id dela, ou seja, para cada nova inserção este valor é atualizado para o próximo, uma sequencia que pode caracterizar como um campo de ID.

Sendo assim, o melhor seria você deixar seus modelos da seguinte forma:

@Entity
@Table(name = "MRP")
public class MRP implements Serializable{

    @Id
    @Column(name= "SEQ_MRP")
    private BigDecimal sequenciaMRP;

    @Column(name= "EMPRESA")
    private String empresa;

    @ManyToOne
    @JoinColumn(name = "projeto")
    private Projeto projeto;

    @Column(name= "REFERENCIA")
    private String referencia;

    @Column(name= "PANTONE")
    private String pantone;

    @Column(name= "DATA")    
    private Date data ;

    //getters e setters    
}

O uso da MRPID, a principio seria desnecessário. O mapemanto do seu relacionamento seria da seguinte forma:

@Entity
@Table(name="PROJETO")
public class Projeto {
    //demais atributos do projeto, como nome do projeto
    //data de criação e  etc.

    @OneToMany(mappedBy = "projeto")
    private Set<MRP> mrps;

Note que criamos um relacionamento na classe MRP para a classe projeto. Algumas coisas não estão totalmente claras no exemplo que você citou como o porque do projeto estar mapeado como uma String, no banco deveria ser o id ou seja um inteiro, ou atualmente a referência é guardada por um código ? Caso seja só seria necessário alterar a anotação do @JoinColumn acrescentando um inverseColumn dizendo a qual coluna lá na outra tabela ela se refere.

Espero ter ajudado!!!