【发布时间】:2021-02-23 12:26:07
【问题描述】:
我有 4 个实体:workflowEntity、PhaseEntity、RoundEntity 和 BlockEntity。 结构应该如下:
Workflow:
Phase:
Round(optional):
Block
or if there are no rounds, since round_id in workflow_binding table is nullable;
Workflow:
Phase:
Block
我需要 workflowEntity 与 Phase、Block 或 Round 实体绑定时,以保存这些实体的信息,但那些其他实体不应包含其“结构子代”的任何信息。例如,我请求 getAllPhases(),那么返回的那些阶段不应包含任何块或轮次的信息,因为除非阶段在工作流中绑定,否则它们不会以任何方式与块或轮次绑定。它们只能与绑定的 workflowEntity 中的 Blocks 和 Rounds 绑定。
我曾尝试使用@JoinTable(已注释掉 workflowEntity、PhaseEntity 和 RoundEntity 中的示例),但这返回的数据过多,未绑定到请求的工作流。
基本上我需要 WorkflowEntity 来包含以下字段:
private Map<PhaseEntity, Map<RoundEntity, Set<BlockEntity>>> phaseRoundEntityMap;
private Map<PhaseEntity, Set<BlockEntity>> phaseBlockEntityMap;
@Entity
@Data
@Table(name="workflow")
public class WorkflowEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id")
private UUID id;
@NotBlank
@Size(min = 1, max = 255)
@Column(name= "name")
private String name;
@Column(name="days")
private Integer days;
/*
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinTable(name = "workflow_binding",
joinColumns = {@JoinColumn(name = "workflow_id")},
inverseJoinColumns = {@JoinColumn(name = "workflow_phase_id")})
private Set<PhaseEntity> phases;*/
//I need to map these somehow
private Map<PhaseEntity, Map<RoundEntity, Set<BlockEntity>>> phaseRoundEntityMap;
private Map<PhaseEntity, Set<BlockEntity>> phaseBlockEntityMap;
}
@Entity
@Data
@Table(name="workflow_phase")
@NoDuplicatePhases
public class PhaseEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", updatable = false, nullable = false)
private UUID id;
@NotBlank
@Size(min = 1, max = 255)
private String name;
@Size(max = 1500)
private String description;
private Integer sequenceNumber;
// Phase shouldnt actually contain any information about blocks nor rounds, unless bound with a workflow.
/* Commented out, because includes blocks and rounds not bound to requested workflow
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinTable(name = "workflow_binding",
joinColumns = {@JoinColumn(name = "workflow_phase_id")},
inverseJoinColumns = {@JoinColumn(name = "workflow_block_id")})
private Set<BlockEntity> blocks;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinTable(name = "workflow_binding",
joinColumns = {@JoinColumn(name = "workflow_phase_id")},
inverseJoinColumns = {@JoinColumn(name = "workflow_round_id")})
private Set<RoundEntity> rounds;*/
}
@Entity
@Data
@Table(name="workflow_round")
@NoDuplicateRounds
public class RoundEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", updatable = false, nullable = false)
private UUID id;
@NotBlank
@Size(min = 1, max = 255)
private String name;
private Integer sequenceNumber;
/*Commented out, because includes blocks not bound to requested workflow
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinTable(name = "workflow_binding",
joinColumns = {@JoinColumn(name = "workflow_round_id", nullable = false, updatable = false)},
inverseJoinColumns = {@JoinColumn(name = "workflow_block_id", nullable = false, updatable = false)})
private Set<BlockEntity> blocks;*/
}
@Entity
@Data
@Table(name = "workflow_block")
public class BlockEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", updatable = false, nullable = false)
private UUID id;
@NotBlank
@Size(min = 1, max = 255)
private String name;
@Size(max = 1500)
private String description;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.MERGE}, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinTable(name = "workflow_assignment_block",
joinColumns = {@JoinColumn(name = "workflow_block_id", nullable = false, updatable = false)},
inverseJoinColumns = {@JoinColumn(name = "workflow_assignment_id")})
private Set<AssignmentEntity> assignments;
private Integer sequenceNumber;
@Column(name = "due_date_day")
private Integer dueDate;
}
【问题讨论】:
标签: java hibernate dictionary jpa nested