2017-11-23 6 views
0

2つのエンティティUserSportがあるとします。私はJPAに、ユーザーに関する情報とお気に入りのスポーツのリストを保存したいと考えています。スポーツテーブルに重複を含めることはできません。 (お気に入りのスポーツが提供されている)データベースにユーザーを追加するたびに、彼のデータは保存され、指定されたスポーツがスポーツテーブルに存在する場合は、既存の行(別のテーブルにある可能性があります)創造された。ノー成功を収めて、次みました:JPAは重複を保存せず、既に存在するフィールドを指します

スポーツエンティティ

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long sportId; 

    //@Column(unique = true) 
    private String sportName; 

    @ManyToMany(mappedBy = "sports") 
    private Set<User> users; 

ユーザエンティティ私は、複数のユーザーが、このように作成したセーブ

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long userId; 

private String username; 

@ManyToMany(cascade = CascadeType.ALL) 
Set<Sport> sports; 

User user1 = new UserBuilder("user1").sports(new Sport("basketball"), new Sport("football")).build(); 
    User user2 = new UserBuilder("user2").sports(new Sport("tennis")).build(); 
    User user3 = new UserBuilder("user3").sports(new Sport("football")).build(); 

Iウィスポーツテーブルには複数の「バスケットボール」フィールドと「フットボール」フィールドがあります。それを防ぐ方法は?事前

+1

既存のオブジェクトを再利用するのではなく、新しい "スポーツ"オブジェクトを毎回作成しています。なぜ、「サッカー」などを作るのではないのですか?同じロジックがJavaオブジェクトに一般的に当てはまります。 JPA固有のものはありません。 – DN1

+0

IDはエンティティを定義するものなので、バスケットボールが1つしかないようにするには、sportNameをIDにして一意であることを確認します。あなたのIDが空白の場合、JPAはそれが新しいとみなして、シーケンスが値を割り当てることができるようにオブジェクトを挿入しなければなりません。しかし、JPAから既存のエンティティを検索し、新しいインスタンスを作成するのではなく、それらの参照を使用する必要があります。 – Chris

答えて

0

おかげで、ユーザーからのスポーツに多くの関係1を探しているように見えます。

スポーツテーブルには、ユーザーの主キーを外部キーとして保持します。

それは

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name ="sports_id") 
    private Long sportId; 
    @Column(name ="sports_name") 
    private String sportName; 
    @ManyToOne 
    @JoinColumn(name= "user_id")  
    private User user; 


@Id 
@GeneratedValue(strategy =  GenerationType.AUTO) 
    @Column(name ="user_id") 
    private Long userId; 
    @Column(name ="user_name") 
    private String username;  
    @ManyToMany(mappedby="user", cascade = CascadeType.ALL) 
    Set<Sport> sports; 

ようにされ、ユーザーの更新は更新され、主キーがNULLであるため、新たなスポーツは、新たに追加され、既存の間、重複がユーザーとスポーツの両方の主キーを使用して回避するために、 idを持つスポーツは同じ行で更新されます

関連する問題