2015-09-22 12 views
6

Ich habe in den folgenden Tabellen enter image description hereZwei Fremdschlüssel als Primärschlüssel

Wie würde ich diese Anmerkungen Hibernate implementieren?

Aktueller Code ist: (gestrippt der Kürze halber)

Benutzer

@Entity 
@Table(name = "user") 
public class User implements java.io.Serializable { 
    @Id 
    @GeneratedValue 
    public Long getId() { 
     return id; 
    } 
} 

Socialnetwork

@Entity 
@Table(name = "social_network") 
public class SocialNetwork implements java.io.Serializable { 
    @Id 
    @GeneratedValue 
    public int getId() { 
     return id; 
    } 
} 

SocialProfile

@Entity 
@Table(name = "social_profile") 
public class SocialProfile implements java.io.Serializable { 
    @Id 
    @ManyToOne 
    @JoinColumn(name="user_id") 
    public User getUser() { 
     return user; 
    } 

    @Id 
    @ManyToOne 
    @JoinColumn(name="social_network_id") 
    public SocialNetwork getSocialNetwork() { 
     return socialNetwork; 
    } 
} 

Offensichtlich funktioniert mein Code jetzt nicht richtig. Kann jemand etwas Licht darauf werfen?

+1

Sie auch eine einfache ID-Spalte hinzufügen können betrachten Sie social_profile und fügen Sie einfach eine einzigartige Beschränkung auf beide FK zusammen. Es ist fast das gleiche, aber viel einfacher zu handhaben, imho – stg

+0

@stg Danke für den Tipp, fügte ich eine ID zu der Tabelle social_profile und ich machte die Felder einzigartig und nicht leer. Viel einfacher so. – prettyvoid

Antwort

4

Sie benötigen eine integrierbare SocialProfileId wie folgt aus:

@Embeddable 
public class SocialProfileId implements Serializable { 
    @Column(name = "user_id") 
    private long userId; 
    @Column(name = "social_network_id") 
    private long socialNetworkId; 
} 

dann, wird Ihr SocialProfile Entität wie folgt aussehen:

@Entity 
@Table(name = "social_profile") 
public class SocialProfile implements java.io.Serializable { 

    @EmbeddedId 
    private SocialProfileId id; 

    @ManyToOne 
    @JoinColumn(name="user_id") 
    public User getUser() { 
     return user; 
    } 

    @ManyToOne 
    @JoinColumn(name="social_network_id") 
    public SocialNetwork getSocialNetwork() { 
     return socialNetwork; 
    } 
} 

EDIT sorry, ich habe gemischte Anmerkungen zu Feldern und Methoden auf meiner Antwort ... tu das nie! ;-)

+0

Danke für die Information. Ich werde das akzeptieren, aber ich entschied mich, mit einem Ersatzschlüssel wie Stg in den Kommentaren vorgeschlagen, macht die Dinge viel einfacher. – prettyvoid

+0

Ja, eine einfache ID ist viel einfacher ... ich habe gerade auf deine Frage hier geantwortet ;-) – Pras

0

Mein Problem für eine REST-Anwendung war ähnlich, aber ein bisschen anders, ich werde es hier posten. Ich hatte 2 Datentabellen: Song & Tag mit einer ID jeder (songid, tagid). Dann hatte ich eine Tabelle zum Zusammenfügen von ihnen Tagassignment, die nur beide Primärschlüssel aus Song und Tag hatte. Also wollte ich mich ihnen nicht anschließen, ich wollte den Tisch mit beiden Fremdschlüsseln behalten.

Quelle meiner Lösung: http://www.objectdb.com/java/jpa/entity/id


Vor

Lied

@Entity 
@Table(name = "songs") 
data class Song(

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    val id: Int, 

    ... 
) 

Tag

@Entity 
@Table(name = "tags") 
data class Tag(

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    val id: Int, 

    ... 
) 

Tagassignment

@Entity 
@Table(name = "tagassignment") 
data class Tagassignment(

    val songid: Int, 

    val tagid: Int 

) 

Nach

ich nicht Lied und Tag änderte.

Tagassignment

@Entity 
@IdClass(value = TagassignmentKey::class) 
@Table(name = "tagassignment") 
data class Tagassignment(

    @Id 
    val songid: Int, 

    @Id 
    val tagid: Int 

) 

und habe ich eine Key-Klasse

TagassignmentKey

class TagassignmentKey(val songid: Int, val tagid: Int) : Serializable { 

    constructor() : this(0, 0) 

} 
Verwandte Themen