Erro hibernate anotações com compositeid e chave estrangeira

1 resposta
renato1010

Pessoal;

Tenho um problema aqui que aparentemente parece ser simples, porém, estou tentando resolvê-lo a alguns dias sem sucesso.
É o seguinte:
Tenho duas tabelas na banco, sendo cf_loja e cd_bomba

estrutura das tabelas:

cf_loja

id_loja -------- serial pk
num_loja------ varchar(2)
nome_loja-----varchar(45)

cd_bomba

id_bomba------ int pk
id_loja----------int pk, fk
num_serie------varchar(20)

Como podem ver, a chave primária da tabela bomba é composta pelo id da bomba e pelo id da loja, sendo que o id da loja é também chave estrangeira da tabela cf_loja.

Preciso que seja chave composta porque a seguinte situação abaixo poderá acontecer:

id_bomba id_loja
1-------------1
2-------------1
3-------------1
1-------------2
2-------------2

Essas tabelas foram mapeadas da seguinte maneira usando hibernate anotações:

VO da tabela cd_bomba:

@Entity
@Table(name = "cd_bomba")

public class CdBombaVO extends ValueObjectImpl implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
     protected CdBombaVOPK cdBombaVOPK;
    @Column(name = "numserie_bomba")
    private String numserieBomba;
    @Column(name = "fabricante_bomba")
       
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_loja", insertable = false, updatable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private CfLojaVO lojaVO;
    
    get/set

VO da tabela cf_loja:

@Entity
@Table(name = "cf_loja")
@SequenceGenerator(name = "cf_loja_id_loja_seq", sequenceName = "cf_loja_id_loja_seq")
public class CfLojaVO extends ValueObjectImpl implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "cf_loja_id_loja_seq")
    @Basic(optional = false)
    @Column(name = "ID_LOJA", nullable = false)
    private Integer idLoja; 
    
    @Column(name = "NUM_LOJA", length = 2)
    private String numLoja;
    @Column(name = "NOME_LOJA", length = 45)
    private String nomeLoja;

    get/set

E foi criada automaticamente pelo Netbeans um VO para conter os ids da chave composta:

VO CdBombaVOPK:

@Embeddable
public class CdBombaVOPK extends ValueObjectImpl implements Serializable {
    
    @Basic(optional = false)
    @Column(name = "id_bomba")
    private int idBomba;
    
    @Basic(optional = false)
    @Column(name = "id_loja")
    private int idLoja;

get/set...

Bom, tentei muitas variações dessas anotações aí mas não tive sucesso em nenhuma tentativa.

O problema que ta dando agora é que na hora de inserir algum registro na tabela bomba aparece a seguinte mensagem:

Pergunto a vocês, esse mapeamento que fiz aí está correto? Essa é a melhor maneira de fazer mesmo?
Como resolver esse problema?

Pesquisando, vi muita gente aconselhando não usar chave composta, mas preciso que o id_bomba e o id_loja possam repetir, so não pode repedir os dois juntos no mesmo registro. Teria uma maneira de fazer funcionar dessa forma sem usar chave composta?

Outra coisa, na tabela cf_loja, não faço nenhum mapeamento referente a esse cadastro de bomba, isso está certo?

Para complementar, estou usando Netbeans 7 e banco Postgres.

Desde já, agradeço a atenção.

1 Resposta

renato1010

Alguém teria alguma ideia de como fazer a restrição dos dois campos sem ter que fazer esse composite id.
Não to conseguindo fazer funcionar do jeito que mostrei acima.

Criado 4 de agosto de 2011
Ultima resposta 5 de ago. de 2011
Respostas 1
Participantes 1