spring data jpa детальный аудит, пользовательский аудит

У меня есть требование, когда мне нужно вставить имя пользователя и имя группы, к которой принадлежит пользователь (оба доступны в SecurityContext) в той же таблице.

class Entity

{ 

   @createdBy 
   String username 

   @createdBy 
   String groupname 

   other fields ...

}

Согласно требованию. Я не могу решить эту проблему, создав пользовательский класс и ссылаясь на него через внешний ключ.

В текущей реализации AuditingHandler оба поля получают одинаковое значение. Как я могу убедиться, что они получают соответствующие значения.

Можно ли этого добиться, используя текущую реализацию? Если нет, то как я могу обеспечить пользовательскую реализацию AuditingHandler?


person data modeller    schedule 21.02.2016    source источник


Ответы (1)


Вы можете создать отдельный встраиваемый класс и аннотировать его с помощью @CreatedBy в своем родительском классе. Один из способов — определить bean-компонент, реализующий AuditorAware, после чего вы можете заставить его возвращать пользовательский объект, содержащий два обязательных поля. Например, ваш родительский класс будет выглядеть так (обратите внимание на аннотацию слушателя):

@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditedEntity {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String id;

    @Embedded
    @CreatedBy
    private AuditorDetails createdBy;

    // setters and getters
}

где AuditorDetails:

@Embeddable
public class AuditorDetails {
    private String username;
    private String groupname;

    // setters and getters

}

и, наконец, ваш bean-компонент AuditorAware:

@Component
class AuditorAwareImpl implements AuditorAware<AuditorDetails> {

    @Override
    public AuditorDetails getCurrentAuditor() {
        return new AuditorDetails()
                .setUsername("someUser")
                .setGroupname("someGroup");
    }
}

AuditingHandler извлекает ваши пользовательские AuditorDetails из вашего bean-компонента AuditorAware (это должен быть один bean-компонент, реализующий его) и устанавливает его в вашей проверяемой сущности.

person J R    schedule 08.08.2016