我想得到一些可能毫无意义的问题的建议,或者可能是这样。让我们有一个配置文件对象,其中包含一个像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() {
}
答案 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
的相应字段。
这也假设所有关系都在同一实体之间。副作用是用户必须选择活动的列表与用户必须选择“兴趣”的列表相同。如果不完全如此,那么你可能需要做更多的事情。