【问题标题】:Multiple Update With Soft Delete Hibernate使用软删除休眠进行多次更新
【发布时间】:2022-09-27 18:30:30
【问题描述】:

尝试使用 @SQLDelete 注释实现软删除。角色(1)和项目组(N)具有一对多关系。当角色被删除时,我必须打破关系。当我删除角色时,角色的 RECORD_STATUS 设置为 D,这是正确的,但是项目组仍然与角色有关系。我们尝试了;

@SQLDelete(sql = \"UPDATE PROJECT_GROUP SET ROLE_OBJID = NULL where ROLE_OBJID = ?; \" +
    \"UPDATE PROJECT_GROUP SET RECORD_STATUS = \'D\' where OBJID = ?\")

但没有奏效。

角色实体;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
@Table(name = \"ROLE\")
@EntityListeners(AuditingEntityListener.class)
@DynamicUpdate
@EqualsAndHashCode(callSuper = false)
@SQLDelete(sql = \"UPDATE ROLE SET RECORD_STATUS = \'D\' where OBJID = ?\")
@Where(clause = \"RECORD_STATUS = \'A\'\")
public class Role extends AuditableEntity {
@Id
@GeneratedValue(generator = \"UUID\")
@GenericGenerator(
        name = \"UUID\",
        strategy = \"org.hibernate.id.UUIDGenerator\"
)
@Column(name = \"OBJID\", unique = true, nullable = false)
private UUID id;

@Column(name = \"NAME\", nullable = false, unique = true)
private String name;

@Column(name = \"DESCRIPTION\", nullable = false)
private String description;

@Enumerated(EnumType.STRING)
@Column(name = \"RECORD_STATUS\", nullable = false)
@ColumnDefault(\"A\")
private Status status = Status.A;

@ManyToMany(
        fetch = FetchType.LAZY,
        cascade = {
                CascadeType.PERSIST,
                CascadeType.MERGE
        })
@JoinTable(name = \"ROLE_AUTHORIZATION\",
        joinColumns = {@JoinColumn(name = \"ROLE_OBJID\")},
        inverseJoinColumns = {@JoinColumn(name = \"AUTHORIZATION_OBJID\")})
@Where(clause = \"RECORD_STATUS = \'A\'\")
private Set<Authorization> authorizations = new HashSet<>();

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = \"role\")
@Where(clause = \"RECORD_STATUS = \'A\'\")
private Set<ProjectGroup> projectGroup = new HashSet<>();


public void addAuthorization(Authorization authorization) {
    if (this.authorizations == null) {
        this.authorizations = new HashSet<>();
    }
    this.authorizations.add(authorization);
}

public void removeAuthorizationByAuthorizationId(UUID authorizationId) {
    this.authorizations.stream().filter(auth -> auth.getId().equals(authorizationId)).findFirst().ifPresent(authorization -> this.authorizations.remove(authorization));
}

}

项目组实体;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
@Table(name = \"PROJECT_GROUP\")
@EntityListeners(AuditingEntityListener.class)
@DynamicUpdate
@EqualsAndHashCode(callSuper = false, exclude = {\"project\"})
@SQLDelete(sql = \"UPDATE PROJECT_GROUP SET RECORD_STATUS = \'D\' where OBJID = ?\")
@Where(clause = \"RECORD_STATUS = \'A\'\")
public class ProjectGroup extends AuditableEntity {
@Id
@GeneratedValue(generator = \"UUID\")
@GenericGenerator(
        name = \"UUID\",
        strategy = \"org.hibernate.id.UUIDGenerator\"
)
@Column(name = \"OBJID\", unique = true, nullable = false)
private UUID id;

@Column(name = \"NAME\", nullable = false, unique = true)
private String name;

@OneToOne(fetch = FetchType.LAZY)
@JsonIgnore
@JoinColumn(name = \"PROJECT_OBJID\", referencedColumnName = \"OBJID\")
@Where(clause = \"RECORD_STATUS = \'A\'\")
private Project project;

@Enumerated(EnumType.STRING)
@Column(name = \"RECORD_STATUS\", nullable = false)
@ColumnDefault(\"A\")
private Status status = Status.A;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = \"ROLE_OBJID\", referencedColumnName = \"OBJID\")
private Role role;

public void addProject(Project project) {
    this.project = project;
    project.setProjectGroup(this);
}
}

    标签: hibernate jpa


    【解决方案1】:

    我建议您在Role 中使用@PreRemove 侦听器,它将每个关联ProjectGrouprole 设置为null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2012-10-17
      • 1970-01-01
      • 2011-11-06
      • 2019-02-07
      • 2013-03-08
      相关资源
      最近更新 更多