2016-12-23 7 views
2

Я использую @Audited аннотацию для моей базовой модели. Я распространяю это на все мои сущности. но он не работает. Есть ли способ я могу использовать, чтоБазовая модель с @Audited

это моя базовая модель

@MappedSuperclass 
@Getter 
@Setter 
@Audited 
public abstract class BaseModelObject implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 4194525198831057382L; 


    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    protected Long id; 
} 

Это моя модель класса

@Entity 
public class City extends BaseModelObject { 

    private static final long serialVersionUID = 1L; 

    @Column 
    private String name; 
} 

ответ

4

@Audited аннотаций не работает так, как вы считаете, это должно быть. Используя его в суперклассе, он не влияет на дочерние классы, которые его расширяют, по крайней мере, чтобы контролировать, является ли ребенок или не проверен. Это по дизайну.

Рассмотрите понятие, в котором у нас есть тип суперкласса и две различные реализации, которые мы хотим проверить с помощью своих свойств суперкласса и того, что у нас нет.

@MappedSuperclass 
@Audited 
public class Animal {} 

@Entity 
@Audited 
public class Cat extends Animal {} 

@Entity 
public class Dog extends Animal {} 

В этом примере, поскольку @Audited не передается по наследству, просто поместив аннотацию на суперкласс и результат Cat сущности в только Cat проверяемого. Объект Dog и его значения свойств суперкласса не являются.

Если @Audited были обработаны как унаследованная аннотация, нам необходимо ввести ряд аннотаций @AuditOverride, чтобы выполнить тот же пример, как показано ниже.

@MappedSuperclass 
public class Animal {} 

@Entity 
@Audited 
@AuditOverride(...) 
public class Cat extends Animal {} 

@Entity 
public class Dog extends Animal {} 

Что делает это хуже, если Animal было подмножество его свойств ревизии, которая будет влиять на количество @AuditOverride с.

Это становится еще более сложным, когда вы начинаете рассматривать стратегии наследования сущностей и как они вступают в игру с тем, следует ли проверять сущность или нет, и в какой степени на каком уровне иерархии.

Общая дискуссия HHH-6331 и HHH-9770.

Короче говоря, если вы хотите, чтобы ваши дочерние классы проверялись, они должны быть явно аннотированы.

+0

спасибо - Naros – wthamira

+0

Это описание для меня очень ясное! – wthamira

+0

мы можем хранить данные аудита в отдельной базе данных вместо основной базы данных? – wthamira

1

Попробуйте с этим:

суперкласса:

@MappedSuperclass 
@EntityListeners(AuditingEntityListener.class) 
public abstract class AuditableEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @CreatedDate 
    private LocalDateTime createdDate; 

    @LastModifiedDate 
    private LocalDateTime lastModifiedDate; 

    @CreatedBy 
    private String createdBy; 

    @LastModifiedBy 
    private String lastModifiedBy; 

    ... 
} 

Сущность cl жопа:

@Entity 
public class City extends AuditableEntity { 

    @Id 

    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    ... 
} 

Конфигурация:

@EnableJpaAuditing 
@SpringBootApplication 
@EnableTransactionManagement 
@EntityScan("foo.entities") 
@ComponentScan("foo") 
@EnableJpaRepositories("foo.repositories") 
public class ConfigApp { 

    ... 
} 

ревизор службы:

@Service 
public class AuditorServiceImpl implements AuditorAware<String> { 

    @Override 
    public String getCurrentAuditor() { 
     return SecurityContextHolder.getContext().getAuthentication().getName(); 
    } 
} 
+0

Этот аудит с JPA. в этом методе у меня возникла большая проблема. потому что данные записываются в одной таблице. не может получить данные истории. В Hibernate Envers также содержатся данные истории. эта база вопросов в Hibernate Envers. Можем ли мы использовать их вместе. Http: //www.baeldung.com/database-auditing-jpa – wthamira

Смежные вопросы