简体   繁体   English

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

[英]How to manage several entities with JPA?

Context语境

I'm trying to create a simple API to learn Spring Boot and JPA.我正在尝试创建一个简单的 API 来学习 Spring Boot 和 JPA。 Informations are stored into H2 database.信息存储在H2数据库中。

I have 2 entities : mission and user .我有 2 个实体: missionuser

Several users are assigned to a mission.多个用户被分配到一个任务。 And users can be assigned to different missions.并且用户可以被分配到不同的任务。

So, my class Mission has an attribute private ArrayList<User> users;所以,我的类Mission有一个属性private ArrayList<User> users; . .

Objective客观的

My goal is to create some requests as :我的目标是创建一些请求:

  • (GET request) IP/missions/123456/users : Get all users assigned to mission 123456 (GET 请求) IP/missions/123456/users : 获取分配给任务123456所有用户
  • (PUT request) IP/missions/456789 : Assigned users to mission 456789 (PUT 请求) IP/missions/456789 : 分配给任务456789用户

So, tied both entities.所以,绑定两个实体。

Problematic有问题

But I don't know how to store/tie informations relative to mission and user .但我不知道如何存储/绑定与missionuser The good way is to create an "associative table" with the scheme Assignements(id_user, id_mission) ?好的方法是使用方案Assignements(id_user, id_mission)创建一个“关联表”?

Thanks for help!感谢帮助!

Edit 1 : Code编辑1:代码

Entity Mission实体使命

@Entity
public class Mission{

    @Id
    private String id;
    private String name;
    private Date start;
    private Date end;
    private ArrayList<User> users;
    private int status;

    public Mission() {
    }

    public Mission(String name, Date start, Date end) {
        this.name = name;
        this.start = start;
        this.end = end;
        this.status = 0;
    }

    // getters and setters
}

Entity User实体用户

@Entity
public class User {

    @Id
    private String id;
    private String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    // getters and setters
}

SQL SQL

I use a SQL script.我使用 SQL 脚本。 Currently, script looks like :目前,脚本看起来像:

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)

Edit 2 : New code (with @ManyToMany)编辑 2:新代码(使用@ManyToMany)

Entities实体

@Entity
public class Mission {

    @Id
    private String missionid;
    private String namemission;
    private Date start;
    private Date end;
    @ManyToMany
    @JoinTable(name = "mission_user",
        joinColumns = @JoinColumn(name = "missionid"),
        inverseJoinColumns = @JoinColumn(name = "userid")
    )
    private Set<User> users = new HashSet<>();
    private int status;

    public Mission() {}

    public Mission(String name, Date start, Date end) {
        this.namemission = name;
        this.start = start;
        this.end = end;
        this.status = 0;
    }
}

@Entity
public class User {

    @Id
    private String iduser;
    private String nomuser;
    @ManyToMany(mappedBy = "users")
    private Set<Mission> missions = new HashSet<>();

    public User() {}

    public User(String nom) {
        this.nomuser = nom;
    }

}

Repositories存储库

@RepositoryRestResource(collectionResourceRel = "mission")
public interface MissionResource extends JpaRepository<Mission, String> {
    ...
}

@RepositoryRestResource(collectionResourceRel = "user")
public interface UserResource extends JpaRepository<User, String> {
    ...
}

Rest Controller休息控制器

@RestController
@RequestMapping(value = "/missions", produces = MediaType.APPLICATION_JSON_VALUE)
@ExposesResourceFor(Mission.class)
public class MissionRepresentation {
    private final MissionResource missionResource;
    private final UserResource userResource;

    public MissionRepresentation(MissionResource missionResource, UserResource userResource) {
        this.missionResource = missionResource;
        this.userResource = userResource;
    }

    // mapping
}

The best would be to implement a joining table, just as you said.最好的办法是实现一个连接表,就像你说的那样。 That would be something like:那将是这样的:

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

Then a @ManyToMany using this table as mapping or entity like MissionUser and map both User and Mission as @OneToMany to it.然后@ManyToMany使用此表作为映射或实体(如MissionUser并将UserMission作为@OneToMany到它。

The mission class will have:任务类将有:

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

and User class will have:和用户类将有:

@Entity
public class User {
...

    @ManyToMany(mappedBy = "users")
    private List<Mission> missions;
...
}

this will create a table in your database with name something like: missions_uesrs and it will have missionId and userId as only columns.这将在您的数据库中创建一个名称类似于:missions_uesrs 的表,并且它只会将 MissionId 和 userId 作为列。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM