【问题标题】:JPA: How to handle multiple EntitiesJPA:如何处理多个实体
【发布时间】:2017-03-22 02:27:18
【问题描述】:

我是 JPA 的新手,对如何处理实体有疑问。就我而言,我有 3 个实体:用户、组和事件。

一个事件总是属于一个组。这意味着存在 OneToMany-Relation。一个用户可以订阅多个组,这意味着存在多对多关系。现在是我遇到麻烦的部分。用户还可以订阅多个事件,这意味着还有一个 ManyToMany-Relation。

作为代码:

用户

@Entity
public class User {

    @Id
    @GeneratedValue
    private Integer id;

    @Embedded
    @OneToOne
    @JoinColumn(name = "company_location")
    private CompanyLocation companyLocation;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
            name = "user_group_subscriptions",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"))
    private List<Group> subscribedGroups;
    ...
}

组

@Entity
public class Group {

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(???)
    private List<Event> events;
    ...
}

现在我的问题。如何在取决于用户实体的组实体中拥有一个包含订阅事件的列表? 我的目标是这样的:

user.getSubscribedGroups().get(0).getSubscribedEvents();

【问题讨论】:

  • 组-事件关系应该是多对多,因为许多组可以订阅许多事件并且订阅可以重叠。就像使用 User#subscribedGroup 一样,通过连接表执行此操作 One2Many 和 ManyToMany 都可以使用连接表完成。
  • @Antoniossss 但这意味着一个事件可以有多个组,这是不可能的
  • 我不知道细节,但例如管理员和版主应该能够订阅例如。系统关机事件——一个事件多组。我想我的组概念是不同的,但这并不重要。 One2Many 可以通过@JoinTable 完成
  • 至于您显示的图表,事件可以有多个组-因此您的关系是不同的。如果单个事件可以有只有一个组,那么关系应该是 1-1
  • 我不明白。您要做的是获取用户-> 组-> 事件。这可以通过您拥有的简单映射来实现。我不知道是什么给你带来了这里的麻烦。要么使用额外的连接表来映射组事件(就像你对用户组所做的那样,但使​​用@OneToMany),或者在事件中放置组 ID。

标签: java hibernate jpa spring-boot spring-data


【解决方案1】:

试试这个:

@Entity
public class Event{

@Id
@GeneratedValue
private Integer id;

@ManyToOne
@JoinColumn(name = "your_column")
private Group group;

@ManyToMany
@JoinTable(....)
private List<User> users;

...

}

@Entity
public class Group {

@Id
@GeneratedValue
private Integer id;

@OneToMany(mappedBy = "group")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Event> events;

...
}

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2018-03-21
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多