Java 如何使用JPA管理多个实体?

Java 如何使用JPA管理多个实体?,java,sql,spring,set,spring-data,Java,Sql,Spring,Set,Spring Data,上下文 我试图创建一个简单的API来学习SpringBoot和JPA。信息存储在H2数据库中 我有两个实体:任务和用户 多个用户被分配到一个任务。用户可以被分配到不同的任务 因此,我的类Mission有一个属性private ArrayList users 目标 我的目标是创建以下请求: (获取请求)IP/missions/123456/users:获取分配给任务的所有用户123456 (PUT请求)IP/missions/456789:分配给任务的用户456789 因此,将两个实体捆绑在一

上下文

我试图创建一个简单的API来学习SpringBoot和JPA。信息存储在H2数据库中

我有两个实体:
任务
用户

多个用户被分配到一个任务。用户可以被分配到不同的任务

因此,我的类
Mission
有一个属性
private ArrayList users

目标

我的目标是创建以下请求:

  • (获取请求)
    IP/missions/123456/users
    :获取分配给任务的所有用户
    123456
  • (PUT请求)
    IP/missions/456789
    :分配给任务的用户
    456789
因此,将两个实体捆绑在一起

有问题

但是我不知道如何存储/绑定与
任务
用户
相关的信息。好的方法是用scheme
赋值(id\u用户,id\u任务)
创建一个“关联表”

谢谢你的帮助

编辑1:代码

实体任务

SQL

我使用SQL脚本。当前,脚本看起来像:

INSERT INTO mission (id, name, start, end, status) VALUES ('de7d9052-4961-4b4f-938a-3cd12cbe1f82', 'mission 1', '2019-02-11', '2019-02-13', 0)
INSERT INTO mission (id, name, start, end, status) VALUES ('425e7701-02c6-4de3-9333-a2459eece1c8', 'mission 2', '2019-02-10', '2019-02-15', 0)
编辑2:新代码(使用@manytomy)

实体


正如您所说,最好是实现一个联接表。这大概是:

create table mission_user (
    mission_id int,
    user_id int,
    primary key (mission_id, user_id)
)

然后一个
@ManyToMany
使用此表作为映射或实体,如
MissionUser
,并将
用户
任务
映射为
@OneToMany

最好的方法是实现一个连接表,正如您所说的。这大概是:

create table mission_user (
    mission_id int,
    user_id int,
    primary key (mission_id, user_id)
)

然后一个
@ManyToMany
使用此表作为映射或实体,如
任务用户
,并将
用户
任务
映射为
@OneToMany

任务类将具有:

@Entity
public class Mission {
...
    @ManyToMany(mappedBy = "missions")
    private List<User> users;
...
}
@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}
@实体
公课使命{
...
@许多(mappedBy=“任务”)
私人名单用户;
...
}
和用户类将具有:

@Entity
public class Mission {
...
    @ManyToMany(mappedBy = "missions")
    private List<User> users;
...
}
@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}
@实体
公共类用户{
...
@多人(mappedBy=“用户”)
非公开名单特派团;
...
}

这将在您的数据库中创建一个名为:missions_uesrs的表,它将仅包含missionId和userId列

任务类将具有:

@Entity
public class Mission {
...
    @ManyToMany(mappedBy = "missions")
    private List<User> users;
...
}
@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}
@实体
公课使命{
...
@许多(mappedBy=“任务”)
私人名单用户;
...
}
和用户类将具有:

@Entity
public class Mission {
...
    @ManyToMany(mappedBy = "missions")
    private List<User> users;
...
}
@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}
@实体
公共类用户{
...
@多人(mappedBy=“用户”)
非公开名单特派团;
...
}


这将在您的数据库中创建一个名为:missions_uesrs的表,它将仅包含missionId和userId列

关联表的困难是什么?这不是一个困难,但我不知道使用关联表是否是使用这些工具解决问题的最佳方法。在我看来,它就像一个多对多关联,所以这似乎是正确的方法(对于rdbms,因为您使用的是h2和jpa,所以这似乎是相关的;对于nosql,答案会有所不同).Yep我不使用nosql。因此,您向我确认,JPA持久化集合/列表的唯一方法是使用关联表?注释或其他东西不允许我们更简单地进行操作?向我们展示一次尝试。代码在哪里?关联表有什么困难?这不是一个困难,但我不知道是否需要使用关联表使用这些工具解决问题的最佳方法。在我看来,这就像是一个多对多关联,因此这似乎是正确的方法(对于rdbms,因为您使用的是h2和jpa,所以这似乎是相关的;对于nosql,答案将不同).Yep我不使用nosql。因此,您向我确认,JPA保存集合/列表的唯一方法是使用关联表?注释或其他东西不允许我们更简单地进行操作?向我们展示一次尝试。代码在哪里?好的,谢谢。因此,当URL
IP/missions/123456/users时,我必须删除属性
ArrayList users
被称为“我获取与此任务相关的用户”,请求位于
任务用户
表?如果您使用加入表,则是的,
用户
列表应替换为
任务用户
。抱歉,我不明白为什么需要
任务用户
列表。正如我所说,您也可以使用
@Join表
相反,最好是运行它:)它不是应该是
私有集
而不是
私有集
?除此之外还可以,谢谢。所以我必须删除属性
arraylistusers
?当调用URL
IP/missions/123456/users
时,我在
mission\u user
表上获取与此任务相关的用户请求?如果您使用加入表,则是,
用户
的列表应替换为
任务用户
的列表。抱歉,我不明白为什么需要
任务用户
的列表。正如我所说,您也可以使用
@JoinTable
而不是最好的运行方法:)它不是应该是
私有集
而不是
私有集
?除此之外似乎还可以