JPA / Hibernate Eager中的多个多对多关系

时间:2017-05-28 17:29:55

标签: java hibernate spring-mvc jpa

我想得到一些可能毫无意义的问题的建议,或者可能是这样。让我们有一个配置文件对象,其中包含一个像Many One这样的Many2Many关系的一组兴趣:

@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和兴趣表。 profile_interest表将有一个profile_id和一个interest_id,对吗?

现在想象一下,我还想让其他一套让我们说:活动,激情或讨厌,不喜欢,任务,职业。我可以一次又一次地重复这些相同的过程,以涵盖6个新的(活动,激情,讨厌,厌恶,任务,职业)。

在某些时候,一个人可能对汽车有兴趣,不管其他人是否对汽车充满热情,第三个人讨厌汽车,第四个人说汽车是他的职业。

如果我创建7个不同的对象集(兴趣,活动,激情,仇恨,厌恶,任务,职业),我将在所有表格中重复其中的许多对象。

- 是否有任何方法可以为7组对象提供共同(兴趣,活动,激情,讨厌,不喜欢,任务,职业)表,但有7个不同的中间表(profile_interests,profile_activities,profile_passions, profile_hates,profile_dislikes,profile_task,profile_vocation)使用公用表?

感谢。感谢您对非程序员的帮助。可能是一个记录良好且已经解决的问题,我不知道。

PD:兴趣实体在这里:

@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() {
}

1 个答案:

答案 0 :(得分:0)

在JPA 2中,实体可以通过多种方式相关 - 而且完全合法。因此,就像兴趣一样,(说)活动将在Profile实体中映射为:

@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

您尚未显示Interest实体。 如果关系是双向的,Interest必须有许多不同的Set<Profile>字段,每个字段对应一个(兴趣,活动......)。在这种情况下,mappedBy实体中字段的Interest属性必须指向Profile的相应字段。

这也假设所有关系都在同一实体之间。副作用是用户必须选择活动的列表与用户必须选择“兴趣”的列表相同。如果不完全如此,那么你可能需要做更多的事情。