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;
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.
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.