所以對于這個任務,我應該有 2 個微服務(任務服務和用戶服務),每個都有自己的資料庫。一個任務可以分配給多個用戶,但多個用戶可以分配給多個任務,因此它是多對多關系。
這兩個微服務都是使用 Hibernate 的 Spring Boot 應用程式,我正在努力在任務服務中的任務和用戶之間建立這種關系,因為我認為復制用戶服務中已經存在的用戶模型不是一個好主意,轉到任務服務。
此分配假設在不使用外鍵的情況下,兩個資料庫中的用戶 ID 具有一致性。
對于背景關系:
從 Hibernate 生成的所需物體關系圖:
Task.java [任務服務]
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class Task extends BaseEntity {
private String name, description;
@ManyToOne
private Lane lane;
@OneToMany
private List<TaskUser> users;
}
TaskUser.java [任務服務]
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode
public class TaskUser {
@Id
private Long id;
@Column(name = "task_id")
private Long taskId;
@Column(name = "user_id")
private Long userId;
}
User.java [user-service]
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class User extends BaseEntity {
@Column(unique = true)
private String username;
}
Currently, Hibernate is generating both a task_user & task_users table inside the task-service database and I'd like to just have 1 intermediate table instead of two.
Question: How would I make this many-to-many relationship work with Hibernate whilst working with two different microservices?
uj5u.com熱心網友回復:
也許更好的休眠映射:
Task.java [任務服務]
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class Task extends BaseEntity {
private String name, description;
@ManyToOne
private Lane lane;
@OneToMany(mappedBy="task")
private List<TaskUser> users;
}
TaskUser.java [任務服務]
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode
public class TaskUser {
@Id
private Long id;
@ManyToOne
@JoinColumn(name="task_id", nullable=false)
private Task task;
@Column(name = "user_id")
private Long userId;
}
uj5u.com熱心網友回復:
用例:將現有任務分配給現有用戶。您可以一次將多個用戶分配給 1 個任務。
請求后
/tasks/allocation/new
請求正文:
{
"task-id": 12345,
"users": [
{
"username": "user-1",
"user-id": 101
},
{
"username": "user-2",
"user-id": 102
},
{
"username": "user-3",
"user-id": 103
}
]
}
發布請求有一個任務和要分配給該任務的用戶詳細資訊串列。
任務分配檔案
@Data
public class TaskAllocation{
@jsonProperty("task-id")
private long taskId;
@JsonProperty("users")
private List<Users> userList;
}
用戶.java
@Data
public class Users{
@jsonProperty("username")
private String username;
@JsonProperty("user-id")
private Long userId;
}
休息控制器
@PostMapping("/tasks/allocation/new")
public CompletableFuture<ResponseEntity<?>> assignTaskToUsers(@ResponseBody @Valid TaskAllocation taskAllocation){
// service call
}
內部服務:
- 從任務資料庫中獲取任務(驗證任務是否存在)
- 如果需要,從用戶服務中獲取用戶的詳細資訊(對于每個用戶),需要對用戶服務進行異步或休息呼叫。任務服務沒有用戶的詳細資訊。
- 對于每個用戶: 1.創建新的分配
- 設定任務 ID
- 設定用戶 ID 或用戶名
- 節省
任務已經存在
表任務分配
--------------------------------------------------------------
alloc-id(Pk) task-Id(Fk) user-id timetamp
--------------------------------------------------------------
1 12345 101 123123123123
2 12345 102 123123123123
3 12345 103 123123123123
物體
Task并且TaskAllocation具有 1:n 關系,即task-allocation表由具有相同task-id.
任務.java
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "sirf_tournament")
public class Task extends Auditable<String> implements Serializable {
@Id
@GeneratedValue
private Long taskId;
private String taskName;
// others
@OneToMany(
fetch = FetchType.LAZY,
mappedBy = "task",
cascade = CascadeType.ALL,
orphanRemoval = true)
private Collection<TaskAllocation> taskAllocation = new HashSet<>();
}
任務分配檔案
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "sirf_tournament")
public class TaskAllocation extends Auditable<String> implements Serializable {
@Id
@GeneratedValue
private Long allocId;
private Long userId;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "taskId")
private Task task;
// others
}
Usertable 和其他相關物體這里沒有提到。任務服務沒有用戶資訊。
It would be good if you verify every users(all ids can be verified in a single call, return invalid ids from user service) and task ids before persisting them into table.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311286.html
標籤:java spring spring-boot hibernate jpa
