我使用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;
}