如何为多个实体链设置或实施spring数据审核

时间:2018-12-19 17:40:51

标签: spring-boot spring-data-jpa eclipselink

我使用spring数据,jpa,eclipselink。

例如,我有一个来自实体的链,彼此相连。它们每个都扩展了其MappedSuperclass。

主要思想是MainEntity具有创建者字段,该字段应在创建后自动添加;而lastEditor则应在每次MainEntity进行编辑或对其子级/大子级进行编辑/添加时进行编辑。它还与SecondEntity具有OneToMany关系。

SecondEntity与MainEntity具有ManyToOne关系。它还具有创建者字段(条件与MainEntity相同)和ModifyDate,每次对其进行编辑或对其子对象进行编辑时都应将其重置。它还与ThirdEntity具有OneToMany关系。

并且ThirdEntity没有需要自动编辑的任何特定字段。但它与SecondEntity也有ManyToOne关系

然后我将新的SecondEntity添加到MainEntity或编辑其中的一些都工作正常(lastEditor和ModifyDate更改为ne)。但是,如果我希望将新的ThridEntity添加到SecondEntity中,则MainEntity字段lastEditor将被更改,但不会发生。

这是一个非常复杂的结构,几乎所有列和字段都被定义。

请为我提供此任务的解决方案。

这是我的清单

PersistenceConfiguration

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
@ComponentScan(basePackages = {
        "****.persistence.repository",
        "****.persistence.util"
})
public class PersistenceConfiguration {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return new AuditorAwareImpl();
    }
}

AuditorAwareImpl

public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        return SecurityContextHolder.getContext().getAuthentication().getName();
    }
}

MainEntityBase

@Data
@EntityListeners({AuditingEntityListener.class})
@MappedSuperclass
public abstract class MainEntityBase implements Serializable {
    @Id
    @GeneratedValue(generator = "plan-sequence")
    private Long id;

    @CreatedBy
    private String creator = "";

    @LastModifiedBy
    private String lastEditor = "";
}

MainEntity

@Getter
@Setter
@Entity
@Table(name = "MainTable")
@Cacheable
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "FK_ENTITY_ID", nullable = false)),
        @AttributeOverride(name = "creator", column = @Column(name = "FK_CREATOR", length = 8, nullable = false)),
        @AttributeOverride(name = "lastEditor", column = @Column(name = "FK_EDITOR", length = 8, nullable = false))
})
public class MainEntity extends MainEntityBase {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "mainEntity", orphanRemoval = true)
    private List<SecondEntity> secondEntities;
}

SecondEntityBase

@Data
@EntityListeners({SecondEntityListener.class, AuditingEntityListener.class})
@MappedSuperclass
public abstract class SecondEntityBase {
    @Id
    private Long id;

    @CreatedBy
    private String creator = "";

    @LastModifiedDate
    private LocalDate modifyDate;
}

SecondEntity

@Getter
@Setter
@Entity
@Table(name = "SecondTable")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "A_SECONDENTITY_ID", length = 10)),
        @AttributeOverride(name = "creator", column = @Column(name = "A_CREATOR", length = 8)),
        @AttributeOverride(name = "modifyDate", column = @Column(name = "A_MODDATE", length = 10)),
})
public class SecondEntity extends SecondEntityBase {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "secondEntity", orphanRemoval = true)
    private List<ThirdEntity> thirdEntities;

    @ManyToOne
    @JoinColumns({
@JoinColumn(ALL COLUMNS OMITED)
    })
    @JoinFetch(JoinFetchType.INNER)
    private MainEntity mainEntity;
}

SecondEntityListener(仅用于记录SecondEntity的更改,它的代码无关紧要,但是在这里是

public class SecondEntityListener {
    @PrePersist
    public void onPersist(SecondEntity entity) {
        performLog(entity, INSERTED);
    }

    @PreUpdate
    public void onUpdate(SecondEntity entity) {
        performLog(entity, UPDATED);
    }

    @PreRemove
    public void onRemove(SeecondEntity entity) {
        performLog(entity, DELETED);
    }

    public void performLog(SecondEntity entity, EntityEventType eventType) {
        ContextHelper.getPublisher().publishEvent(new SecondEntityEvent(entity, eventType));
    }
}

ThirdEntityBase

@Data
@EntityListeners({AuditingEntityListener.class})
@MappedSuperclass
public abstract class ThirdEntityBase {
    @Id
    private Long id;
}

ThirdEntity

@Getter
@Setter
@Entity
@Table(name = "ThirdTable")
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "PST_SECOND_ID", length = 10)),
})
public class ThirdEntity extends ThirdEntityBase {

    @ManyToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumns({
            ALL COLUMNS OMITED
    })
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    @JoinFetch(JoinFetchType.INNER)
    private SecondEntity secondEntity;
}

0 个答案:

没有答案