我将@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;
}
答案 0 :(得分:5)
@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
的数量。
当您开始查看实体继承策略以及这些策略是如何审核实体以及在层次结构的什么级别发挥作用时,这变得更加复杂。
简而言之,如果您希望对您的子课程进行审核,则需要明确注释它们。
答案 1 :(得分:2)
试试这个:
超类:
@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;
...
}
实体类:
@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();
}
}