JPA 2 Chave composta e relacionamento

Pessoal,

Vejam, tenho uma classe que possui uma chave primária composta:

@Embeddable
public class PortBrasPK implements Serializable {
    
    @ManyToOne
    @JoinColumn(name="BRAS_FK")
    private Bras bras;
    
    @Column(name = "PORT_BRAS", length = 20, nullable = false)
    private String port;

Classe que usa a classe acima como chave composta

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

    @EmbeddedId()
    private PortBrasPK portBrasPK;
    @Column(name = "TOTAL_CUSTOMER", nullable = false)
    private int totalCustomer;
    @Column(name = "ACTIVE_CUSTOMER")
    private int activeCustomer;

Até aqui td bem, porém na classe abaixo preciso criar um relacionamento com esta classe que possui a chave composta, fiz dessa forma:

@Entity
@Table(name = "DSLAM")
public class Dslam implements Serializable {
    
    @Id
    @Column(name="IP_DSLAM")
    private String ipDslam;    
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="BRAS_FK", referencedColumnName="bras"),
        @JoinColumn(name="PORT_BRAS", referencedColumnName="port")
    })
    private PortBras portBras;    
    @Column(name = "NAME", nullable = false, length = 255)
    private String name;
    @Column(name = "TYPE", nullable = false, length = 100)
    private String type;
    @Column(name = "TOTAL_CUSTOMER", nullable = false)
    private int totalCustomer;
    @Column(name = "ACTIVE_CUSTOMER", nullable = false)
    private int activeCustomer;

Quando compilo, recebo a seguinte mensagem:

Exception Description: The @JoinColumns on the annotated element [private br.com.gvt.acct.entity.PortBras br.com.gvt.acct.entity.Dslam.portBras] from the entity class [class br.com.gvt.acct.entity.Dslam] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referenceColumnName elements must be specified in each such @JoinColumn.

Alguem sabe o que eu estou fazendo de errado?

Tenta colocar outro @JoinColumn(name=“BRAS_FK”)
na outra coluna, ficando assim

@JoinColumn(name=“BRAS_FK”)
@Column(name = “PORT_BRAS”, length = 20, nullable = false)
private String port;

não entendi…

fiz o q vc falou, mesmo erro.

Deixa.é que eu não tinha visto que o segundo elemento era uma String e não uma classe com a qual você relaciona.

sim… sem problema

Aqui tem um exemplo de implementação.

Tente usar o atributo value

http://www.kawoolutions.com/Technology/JPA,_Hibernate,_and_Co./JPA_Composite_Key_Variants

Tenta usar esse atributo @MapsId para indicar qual o atributo que é o id do objeto eu acho.

Passando pelo mesmo problema =(

Somente um dos atributos de PortBras é chave estrangeira para o Dslam não e ?

Na realidade não, preciso da chave primaria do PortBras, como é composta preciso das duas informações, correto?

Sim, mas pelo que vi o Dslam só tem uma chave primária.

Poderia explicar esse relacionamento ?

Isso, a chave primaria do dslam nao é composta, mas ela se relaciona com uma classe que é composta.

Então usa a anotação la do @mapsId e diz qual propriedade ele se relaciona e vê se funciona.

@MapsId(value = “bras”)
@ManyToOne
@JoinColumns({
@JoinColumn(name=“BRAS_FK”, referencedColumnName=“bras”),
@JoinColumn(name=“PORT_BRAS”, referencedColumnName=“port”)
})

Acredito que fica assim.

Dá uma olhada e teste por favor

Dá uma olhada no @JoinColumn(name=“PORT_BRAS”, referencedColumnName=“port”) também.

Esse referencedColumnName não teria que estar PORT_BRAS, pois você colocou o nome da coluna assim ?

Ja tentei isto também… nao rolou, pesquisei na net e vi este tutorial do Hibernate

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e2177

porém, o erro agora é outro:

Exception Description: @OneToMany for attribute name [dslams] in entity class [class br.com.gvt.acct.entity.PortBras] should not have @JoinColumn(s) specified. In the case where the @OneToMany is not mapped by another entity (that is, it is the owning side and is uni-directional), it should specify (optional through defaulting) a @JoinTable.

Você tem uma relacionamento do outro lado ?Porque esse erro fala de um oneToMany e nao um manyToOne

Voce implementou equals e hash code na classe que recebe a chave primária composta nao e ?

Pessoal,

A principio resolvi, mudei a implementação do JPA da TopLink para a do Hibernate.