Я использую данные весны, 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;
}