0

I 3 Datentabelle haben:
Anwendungen {id_app, Version, Name}
Kunden {Org_ID, name}
Verbände {id_app, Version, org_id, status}

Anwendungen haben einen zusammengesetzten Primärschlüssel (id_app, Version), der Primärschlüssel für Kunden ist org_id und Associations hat einen zusammengesetzten Primärschlüssel (id_app, version, org_id).Viele-zu-viele-Beziehung mit zusammengesetzten Schlüsseln, extra Spalte in Hibernate

In meiner Java-Anwendung habe ich die folgenden Klassen:

@Entity 
@Table(name = "Applications") 
@IdClass(ApplicationId.class) 
public class Application implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ID_APP", nullable = false) 
    private String idApp; 
    @Id 
    @Column(name = "VERSION", nullable = false) 
    private String version; 
    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy = "idPk.appPk", fetch = FetchType.LAZY) // cascade = CascadeType.ALL) 
    private List<Association> custApps; 

    // getters and setters 
} 


public class ApplicationId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String idApp; 
    private String version; 

    //hashcode and equals 
} 


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

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ORG_ID", unique = true, nullable = false) 
    private Integer orgID; 

    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy="idPk.customerPk", fetch = FetchType.LAZY) 
    private List<Association> custApps; 

    //getters and setters 
} 


@Entity 
@Table(name = "ASSOCIATIONS") 
@AssociationOverrides({ 
    @AssociationOverride(name = "idPk.appPk", joinColumns = @JoinColumn(name = "ID_APP")), 
    @AssociationOverride(name = "idPk.appPk", joinColumns = @JoinColumn(name = "VERSION")), 
    @AssociationOverride(name = "idPK.customerPk", joinColumns = @JoinColumn(name = "ORG_ID")) 
    }) 
public class Association implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private AssociationId idPk = new AssociationId(); 
    private String state; 

    public Association() { 
     super(); 
    } 

    @EmbeddedId 
    public AssociationId getIdPk() { 
     return idPk; 
    } 

    @Transient 
    public Customer getCustomerPk() { 
     return idPk.getCustomerPk(); 
    } 

    @Transient 
    public Application getAppPk() { 
     return idPk.getAppPk(); 
    } 

    @Column(name = "STATE") 
    public String getState() { 
     return state; 
    } 

    //setters , hashCode and equals 
} 


@Embeddable 
public class AssociationId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private Application appPk; 
    private Customer customerPk; 

    // here is the problem ? 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumns({ @JoinColumn(name = "ID_APP", referencedColumnName = "ID_APP"), 
     @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") }) 
    public Application getAppPk() { 
     return appPk; 
    } 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="ORG_ID") 
    public Customer getCustomerPk() { 
     return customerPk; 
    } 

    //setter, hashCode and equals 
} 


Was sind die richtige Anmerkung? Die Beziehung ist viele zu viele zwischen Anwendung und Kunden, und ich erstelle die Zuordnungstabelle für diese und für die zusätzliche Spalte "state".
Jetzt erhalte ich Fehler: Ein Fremdschlüssel Verweis sla.model.Application von sla.model.Association hat die falsche Anzahl der Spalte. sollte 2 sein.
Bitte helfen Sie.

+0

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite -associations –

+0

Das ist nicht meine Situation, ich habe etwas ähnliches versucht, aber es funktioniert nicht, weil ich auch einen zusammengesetzten Primärschlüssel auf Anwendungstabelle – SimLine

+0

habe Lesen Sie noch einmal. Der Abschnitt, mit dem ich verlinkt habe, sagt: * Im folgenden Beispiel wird die Entitäts-ID "PersonAddress" aus zwei @ ManyToOne-Zuordnungen * gebildet. Das ist ** genau ** was du hast. Die obigen Beispiele zeigen verschiedene andere Lösungen, die alle eine ManyToOne-Verknüpfung als Teil der Kennung aufweisen. –

Antwort

-1

Fertig. Ich wechsle die folgenden:
In Assoziationsklasse:

@AssociationOverrides({ 
@AssociationOverride(name = "idPk.appPk", joinColumns = { @JoinColumn(name = "ID_APP", referencedColumnName = "ID_APP"), 
    @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") }), 
@AssociationOverride(name = "idPK.customerPk", joinColumns = @JoinColumn(name = "ORG_ID")) 
})