2017-05-28 15 views
0

私は何のアドバイスもしていないかもしれませんし、そうでないかもしれません。のは、このようなMany2Many関係に関心のセットを持っているプロファイルオブジェクトを持ってみましょう:JPA/Hibernate Eagerにおける多対多リレーションシップ

@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(name="profile_interests", 
joinColumns={ @JoinColumn(name="profile_id") }, 
inverseJoinColumns = { @JoinColumn(name="interest_id") }) 
@OrderColumn(name="display_order") 
private Set<Interest> interests; 

//GETTER AND SETTERS 
public Set<Interest> getInterests() { 
    return interests; 
} 
public void setInterests(Set<Interest> interests) { 
    this.interests = interests; 
} 
public void addInterest(Interest interest) { 
    interests.add(interest); 
} 
public void removeInterest(String interestName) { 
    interests.remove(new Interest(interestName)); 
} 

を自分のアプリケーションのコントローラでは、私はこの方法で利益を追加および削除することができます。

@RequestMapping(value="/save-interest", method=RequestMethod.POST) 
@ResponseBody 
public ResponseEntity<?> saveInterest(@RequestParam("name") String interestName) { 

    SiteUser user = getUser(); 
    Profile profile = profileService.getUserProfile(user); 

    String cleanedInterestName = htmlPolicy.sanitize(interestName); 

    Interest interest = interestService.createIfNotExists(cleanedInterestName); 

    profile.addInterest(interest); 
    profileService.save(profile); 

    return new ResponseEntity<>(null, HttpStatus.OK); 
} 


@RequestMapping(value="/delete-interest", method=RequestMethod.POST) 
@ResponseBody 
public ResponseEntity<?> deleteInterest(@RequestParam("name") String interestName) { 

    SiteUser user = getUser(); 
    Profile profile = profileService.getUserProfile(user); 

    profile.removeInterest(interestName); 

    profileService.save(profile); 

    return new ResponseEntity<>(null, HttpStatus.OK); 
} 

最終的に、プロファイル、profile_interests、およびinterestテーブルが作成されます。 profile_interestテーブルにはprofile_idとinterest_idがあります。

ここで、私はまた、活動、情熱または憎しみ、嫌いなこと、仕事、召喚という言い方をしたいと考えています。私は6つの新しい(活動、情熱、憎しみ、嫌い、仕事、職業)をカバーするために、これらの同じプロセスを何度も繰り返すことができます。

ある時点で、他の人が車に情熱を持っているかどうか、車に興味を持っている人がいるかもしれません。第3は車を嫌い、第4は車が彼の職業です。

私は7つの異なるオブジェクトセット(関心事、活動、情熱、嫌悪、嫌い、仕事、仕事)を作成すると、すべての表でそれらの多くを繰り返します。

- 7組のオブジェクトの共通の(興味、活動、情熱、嫌い、嫌いな、仕事、職業)表を持っていますが、7つの異なる中間表(profile_interests、profile_activities、profile_passions、profile_hates 、profile_dislikes、profile_task、profile_vocation)を使用していますか?

ありがとうございました。私はプログラマー以外のあなたの助けに感謝します。それは問題がよく文書化され、すでに解決されているかもしれない、私は知らない。

PD:インタレスト・エンティティはここにある:JPAエンティティ2で

@Entity 
@Table(name = "interests") 
public class Interest implements Comparable<Interest> { 

@Id 
@Column(name = "id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "interest_name", unique = true, length = 25) 
private String name; 

public Interest() { 
} 
+0

'EAGER'として' fetchType'を設定するのは 'Many2Many'関係にはあまり適していません、特にあなたはそれを複数持っています。 –

+0

ありがとうハディ、私はそれを複数回使用するとあなたのアドバイスを思い出しますが、それは私が避けようとしている(何度も使用している)ものです。どのようにそれを行う上での任意の提案? – Mike

+0

これは可能ですが、それほど簡単ではありません。profile_interests、profile_activities、profile_passions、profile_hates、profile_dislikes、profile_task、profile_vocationの7つのオブジェクトをマップする必要があります。 – Boschi

答えて

0

は、複数の方法で関連することができます - そしてそれは完全に合法です。あなたはInterestエンティティを示していない

@ManyToMany(fetch=FetchType.LAZY) // don't use EAGER unless you really want to :) 
@JoinTable(name="profile_activities", 
    joinColumns={ @JoinColumn(name="profile_id") }, 
    inverseJoinColumns = { @JoinColumn(name="interest_id") }) 
@OrderColumn(name="display_order") 
private Set<Interest> activities; 

//GETTER AND SETTERS AS FOR interests 

:だから、ただの興味のように、(例えば)の活動は、次のようにProfileエンティティにマッピングされます。 リレーションが双方向である場合、Interestには多くの異なるSet<Profile>フィールドが含まれていなければなりません(関心事、活動など...)。その場合、InterestエンティティのフィールドのmappedBy属性はProfileの適切なフィールドを指していなければなりません。

これは、ビジネス上のすべての関係が同じエンティティ間にあることも前提としています。副作用は、ユーザがアクティビティを選択しなければならないリストが、ユーザが「関心」を選択しなければならないリストと同じであることである。そうでなければ、それ以上のことをしなければならないかもしれません。

+0

ありがとう、 ! – Mike