스프링 데이터 JPA AuditingEntityListener 및 AuditorAware bean으로 JPA 감사를 설정했습니다. 내가 원하는 것은 사전 정의 된 식별자가있는 엔티티에서도 감사 자 상세 정보를 유지할 수 있어야한다는 것입니다. me.auditing.dao.AuditorDetails : - 세척하기 전에 transient 인스턴스를 저장스프링 데이터 JPA 감사는 분리 된 엔티티를 지속 할 때 실패합니다.
객체 참조 저장되지 않은 과도 인스턴스를 : 문제는 사전 정의 된 ID와 JPA 엔티티가 지속와 플러시 될 때 감사 세부 지속 할 수없는 점이다
재미있는 부분은 생성 된 ID를 가진 엔티티가 저장 될 때입니다. 다 괜찮습니다. 두 경우 모두 엔티티가 새로운 것입니다. 최대 절전 모드 코드를 통해 문제를 찾아 낼 수 없었으므로 이것을 시험하기 위해 sample project을 만들었습니다 (테스트 클래스 me.auditing.dao.AuditedEntityIntegrationTest). 미리 정의되고 생성 된 식별자가있는 두 엔티티가 있으며 감사해야합니다.
엔티티는 다음과 같습니다
@Entity
public class AuditedEntityWithPredefinedId extends AuditableEntity {
@Id
private String id;
public String getId() {
return id;
}
public AuditedEntityWithPredefinedId setId(String id) {
this.id = id;
return this;
}
}
과 :
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditableEntity implements Serializable {
private static final long serialVersionUID = -7541732975935355789L;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@CreatedBy
private AuditorDetails createdBy;
@CreatedDate
private LocalDateTime createdDate;
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@LastModifiedBy
private AuditorDetails modifiedBy;
@LastModifiedDate
private LocalDateTime modifiedDate;
그리고 감사 게터 구현은 다음과 같습니다 : 부모 클래스는
@Entity
public class AuditedEntityWithGeneratedId extends AuditableEntity {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
private String id;
public String getId() {
return id;
}
public AuditedEntityWithGeneratedId setId(String id) {
this.id = id;
return this;
}
}
입니다
@Override
public AuditorDetails getCurrentAuditor() {
return new AuditorDetails()
.setId(null)
.setUserId("someUserId")
.setDivisionId("someDivisionId");
}
편집 2016-08-08 : 미리 정의 된 ID를 가진 새로운 엔티티가 저장되면 엔티티가 실제로 새로운 것이 아닌 경우 상당히 논리적 인 createdBy 및 modifiedBy AuditorDetails의 두 인스턴스를 얻는 것처럼 보입니다. 따라서 생성 된 완전히 새로운 엔티티는 동일한 인스턴스의 AuditorDetails를 가져오고 수동으로 설정된 ID를 가진 AuditorDetails는 가져 오지 않습니다. 감사 자 정보를 AuditingHandler에 반환하기 전에 AuditorAware 빈에 감사 자 세부 정보를 저장하여 테스트했습니다.
@Override
@Transactional
public AuditorDetails getCurrentAuditor() {
AuditorDetails details = new AuditorDetails()
.setId(null)
.setUserId("someUserId")
.setDivisionId("someDivisionId");
return auditorDetailsRepository.save(details);
}
그것은 가장 우아한 해결책은 아니지만, 지금은 작동 : 지금은 내가 찾을 수있는 유일한 해결책은 그래서 좋아