2015-09-22 5 views
6

2つの外部キーを主キーとして、私は <a href="https://i.stack.imgur.com/DM6Ft.jpg" rel="noreferrer"><img src="https://i.stack.imgur.com/DM6Ft.jpg" alt="enter image description here"></a></p> <p>がどのように私はこれを実装し、以下の表は、アノテーションを使用して休止している

現在のコードは次のとおり(簡潔にするためにストリッピング)

ユーザ

@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; 
    } 
} 

明らかに私のコードは正しく機能していません。誰かがこれにいくつかの光を当てることができますか?

+1

を作成両方のFKに一意の制約があります。これはほぼ同じだけど扱いがはるかに簡単です。imh – stg

+0

@stgヒントをいただきありがとうございます。私はsocial_profileテーブルに 'id'を追加しました。この方法はずっと簡単です。 – prettyvoid

答えて

4

は、次のような組み込み可能SocialProfileIdが必要になります。

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

そして、あなたのSocialProfileエンティティは次のようになります。

@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申し訳ありませんが、私は持っていますフィールドとメソッドのミックス注釈を私の答えに...決してそれを行う! ;-)

+0

情報ありがとうございます。私はこれを受け入れますが、私は上記のコメントで提案されたstgのようなサロゲートキーを使うことに決めました。 – prettyvoid

+0

はい、単純なIDを持つ方がはるかに簡単です...私はちょうどあなたの質問にここで答えました;-) – Pras

0

RESTアプリケーションの問題は同じでしたが、少し違っていました。私はここに投稿します。 私は2つのデータテーブルを持っていました: & idがそれぞれのid(songid、tagid)のタグです。 その後、私はそれらを一緒に結合するためのテーブルを持っていました。タグ割り当てタグの両方の主キーのみを持っていました。だから私は彼らに加わることを望んでいませんでした、私は両外部キーでテーブルを保持したかったのです。私の解決策の

出典:

ソング

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

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

    ... 
) 

タグ

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

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

    ... 
) 
http://www.objectdb.com/java/jpa/entity/id


Tagassignment

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

    val songid: Int, 

    val tagid: Int 

) 

私はソングタグを変更しませんでした。

Tagassignment

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

    @Id 
    val songid: Int, 

    @Id 
    val tagid: Int 

) 

と私はあなたにもsocial_profileあなたに簡単なID列を追加し、ちょうど追加することを検討してKeyクラス

TagassignmentKey

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

    constructor() : this(0, 0) 

} 

関連する問題

 関連する問題