Как установить или реализовать весенний аудит данных для цепочки многих организаций - PullRequest
0 голосов
/ 19 декабря 2018

Я использую данные весны, jpa, eclipselink.

Например, у меня есть цепочка из сущностей, связанных друг с другом.Каждый из них расширяет свой MappedSuperclass..

Основная идея состоит в том, что у MainEntity есть поле создателя, которое должно быть добавлено автоматически после создания, и lastEditor, который следует редактировать каждый раз, когда редактируется MainEntity или редактируются / добавляются его дочерние элементы.Также он имеет отношение OneToMany к SecondEntity.

SecondEntity имеет отношение ManyToOne к MainEntity.Он также имеет поле создателя (условия те же, что и для MainEntity) и modifyDate, которые должны сбрасываться каждый раз, когда редактируется или редактируются его дочерние элементы.Также он имеет отношение OneToMany к ThirdEntity.

И ThirdEntity не имеет каких-либо особых полей, необходимых для автоматического редактирования.Но он также имеет отношение ManyToOne к SecondEntity

Затем я добавляю новый SecondEntity в MainEntity или редактирую некоторые из них, все работает нормально (lastEditor и modifyDate меняются на ne one).Но если я добавлю новый 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...