簡體   English   中英

如何使用 JPA 管理多個實體?

[英]How to manage several entities with JPA?

語境

我正在嘗試創建一個簡單的 API 來學習 Spring Boot 和 JPA。 信息存儲在H2數據庫中。

我有 2 個實體: missionuser

多個用戶被分配到一個任務。 並且用戶可以被分配到不同的任務。

所以,我的類Mission有一個屬性private ArrayList<User> users; .

客觀的

我的目標是創建一些請求:

  • (GET 請求) IP/missions/123456/users : 獲取分配給任務123456所有用戶
  • (PUT 請求) IP/missions/456789 : 分配給任務456789用戶

所以,綁定兩個實體。

有問題

但我不知道如何存儲/綁定與missionuser 好的方法是使用方案Assignements(id_user, id_mission)創建一個“關聯表”?

感謝幫助!

編輯1:代碼

實體使命

@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
public class User {

    @Id
    private String id;
    private String name;

    public User() {
    }

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

    // getters and setters
}

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:新代碼(使用@ManyToMany)

實體

@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;
    }

}

存儲庫

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

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

休息控制器

@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
}

最好的辦法是實現一個連接表,就像你說的那樣。 那將是這樣的:

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

然后@ManyToMany使用此表作為映射或實體(如MissionUser並將UserMission作為@OneToMany到它。

任務類將有:

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

和用戶類將有:

@Entity
public class User {
...

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

這將在您的數據庫中創建一個名稱類似於:missions_uesrs 的表,並且它只會將 MissionId 和 userId 作為列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM