2016-08-08 1 views
1

스프링 데이터 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); 
} 

그것은 가장 우아한 해결책은 아니지만, 지금은 작동 : 지금은 내가 찾을 수있는 유일한 해결책은 그래서 좋아

답변

1

, 사실과 같이 감사 기관에 쓰기 전에 AuditorDetails를 유지한다.

관련 문제