【问题标题】:4 column binding table into nested Map4列绑定表成嵌套Map
【发布时间】: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


    【解决方案1】:

    为什么不创建一个实体WorkflowBinding

    @Entity
    @Table(name = "workflow_binding")
    public class WorkflowBinding {
    
        @EmbeddedId
        private WorkflowBindingId id;
    
        @ManyToOne(fetch = LAZY)
        @JoinColumn(name = "block_id", insertable = false, updatable = false)
        private BlockEntity block;
    
        @ManyToOne(fetch = LAZY)
        @JoinColumn(name = "round_id", insertable = false, updatable = false)
        private RoundEntity round;
    
        @ManyToOne(fetch = LAZY)
        @JoinColumn(name = "phase_id", insertable = false, updatable = false)
        private PhaseEntity phase;
    
        @ManyToOne(fetch = LAZY)
        @JoinColumn(name = "workflow_id", insertable = false, updatable = false)
        private WorkflowEntity workflow;
    }
    
    @Embeddable
    public class WorkflowBindingId {
        private UUID blockId;
        private UUID roundId;
        private UUID phaseId;
        private UUID workflowId;
    }
    

    反之,您可以进行如下映射:

    public class BlockEntity {
        @OneToMany(mappedBy = "block")
        private Set<WorkflowBinding> bindings;
    
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多