[英]How to manage several entities with JPA?
語境
我正在嘗試創建一個簡單的 API 來學習 Spring Boot 和 JPA。 信息存儲在H2數據庫中。
我有 2 個實體: mission
和user
。
多個用戶被分配到一個任務。 並且用戶可以被分配到不同的任務。
所以,我的類Mission
有一個屬性private ArrayList<User> users;
.
客觀的
我的目標是創建一些請求:
IP/missions/123456/users
: 獲取分配給任務123456
所有用戶IP/missions/456789
: 分配給任務456789
用戶所以,綁定兩個實體。
有問題
但我不知道如何存儲/綁定與mission
和user
。 好的方法是使用方案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
並將User
和Mission
作為@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.