- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Hibernate Envers 将审核支持添加到存储实体关系的表中。
我正在使用 Spring Boot 2.1.5 和 Hibernate 5.3.10。
以下是我的类(class):
审计实体
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.hibernate.envers.Audited;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
@Getter
@Setter
@Audited
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditEntity {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(
name = "uuid",
strategy = "org.hibernate.id.UUIDGenerator",
parameters = {
@Parameter(
name = "uuid_gen_strategy_class",
value = "org.hibernate.id.uuid.CustomVersionOneStrategy"
)
}
)
private String id;
@Column(name = "created_date", updatable = false, nullable = false)
@CreatedDate
private long createdDate;
@Column(name = "modified_date")
@LastModifiedDate
private long modifiedDate;
@Column(name = "created_by")
@CreatedBy
private String createdBy;
@Column(name = "modified_by")
@LastModifiedBy
private String modifiedBy;
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof AuditEntity)) {
return false;
}
AuditEntity r = (AuditEntity) o;
return this.getId().equals(r.getId());
}
}
角色
import lombok.Getter;
import lombok.Setter;
import org.hibernate.envers.Audited;
import org.hibernate.envers.NotAudited;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@Audited
@Entity
@Table(name = "role")
public class Role extends AuditEntity {
@Column(name = "name")
private String name;
@NotAudited
private String dontAudit;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.role")
private Set<UserRole> userRoles = new HashSet<>(0);
}
用户
import lombok.Getter;
import lombok.Setter;
import org.hibernate.envers.Audited;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.HashSet;
import java.util.Set;
@Getter
@Setter
@Audited
@Entity
@Table(name = "user")
public class User extends AuditEntity {
private String sso;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user")
private Set<UserRole> userRoles = new HashSet<>(0);
}
用户角色
import lombok.Getter;
import lombok.Setter;
import org.hibernate.envers.Audited;
import javax.persistence.*;
@Getter
@Setter
@Audited
@Entity
@Table(name = "user_roles")
@AssociationOverrides({
@AssociationOverride(name = "pk.user", joinColumns = @JoinColumn(name = "USER_ID")),
@AssociationOverride(name = "pk.role", joinColumns = @JoinColumn(name = "ROLE_ID"))
})
public class UserRole extends AuditEntity {
@EmbeddedId
private UserRoleId pk = new UserRoleId();
public User getUser() {
return getPk().getUser();
}
public void setUser(User user) {
getPk().setUser(user);
}
public Role getRole() {
return getPk().getRole();
}
public void setRole(Role role) {
getPk().setRole(role);
}
}
用户角色ID
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import java.io.Serializable;
@Getter
@Setter
@Embeddable
@EqualsAndHashCode
public class UserRoleId implements Serializable {
@ManyToOne
private User user;
@ManyToOne
private Role role;
}
当我运行该应用程序时,它会抛出以下错误。但是,当我不从 AuditEntity 扩展 UserRole 时,应用程序会成功启动,但 user_role 表上没有审核列。
错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at com.ercancelik.hibernate.envers.DemoApplication.main(DemoApplication.java:11) [classes/:na]
Caused by: org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:120) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:200) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:642) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:95) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:154) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:118) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:101) ~[hibernate-envers-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:297) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
... 16 common frames omitted
最佳答案
问题具体在于您如何映射UserRole
。如果您发现您已定义 UserRole
来包含 @EmbeddedId
,但您还扩展了 AbstractEntity
类,该类还基于uuid。你根本不能把这两个问题混为一谈。
说实话,我很惊讶你提供的映射实际上并没有抛出 ORM 异常,而不是你一路进入 Envers,因为 ORM 必须在最初应该抛出的地方解析它们关于如何解析标识符的异常。
作为旁注,除非有特定的业务目的来捕获主数据表中创建或修改实体的人员/时间,否则您实际上可以将其捕获为每个事务中的 Envers 修订实体的一部分审计数据,这将减少每条记录存储的数据。
看看 Envers 提供的自定义修订实体;您可以使用 spring-bean 挂接在那里,并使用最新的 Spring 框架与 Hibernate 5.3+ 相结合来收集您需要的任何信息。
关于java - 使用 Hibernate Envers 审核可嵌入实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901899/
Hibernate Envers 是否可以将另一个数据库用于审计表? 最佳答案 您可以使用不同的架构/目录。见 org.hibernate.envers.default_schema和 org.hib
我在我的应用程序中使用 Hibernate Envers 来存储审计跟踪数据,所有与审计相关的信息都正确存储在 *_AUD 表中。但是,所有_AUD表中rev列的数据类型都是Integer数据类型。我
我是 hibernate envers 的新手。我已经成功地为每个实体创建了审计表。但是我不知道如何为每个实体读取这些历史记录。我想在 jsp 中显示这个历史记录。我想阅读所有的历史记录对于那个特定的
我想使用 hibernate envers 在审计表上应用 group by。 我怎样才能做到这一点? 最佳答案 不幸的是,Envers 不支持 Group by。 关于hibernate-enver
我正在尝试使用 hibernate-envers 审核@Embeddable 对象的集合。 根据 https://hibernate.atlassian.net/browse/HHH-6613添加了对
使用 Hibernate Envers 我想获得所有 实体 , 修订号 , 修订日期 和 修订类型 实体的 ID。 目前我这样做是为了获取实体、修订号和修订日期: public List obtene
我从休眠的 Envers 3.6 移植到 Envers 4.0。这个新版本没有 审计事件监听器 .旧版本要求:listeners 我找不到如何配置新版本。 最佳答案 在 4.0 版中:
我的应用程序使用 envers 将数据写入 _aud 表,并将其包装到写入另一个表的 xml 中。我在 Envers 4.3 中使用条件审核来完成此操作。我的类扩展了 EnversIntegrator
我需要为项目中的所有 CRUD 操作实现审计历史记录。该项目使用 Spring JPA Data Rest。我四处寻找好的图书馆来完成所需的任务,并遇到了这个 Hibernate Envers ,这看
我正在做很多 rnd 来为一个大项目做审计。该项目将完全基于带有 JPA 和 Hibernate 的 Spring 框架来完成数据映射部分。对于审计,我遇到了各种特性和技术。使用 Hibernate
用户有 n 个联系人。联系人可以有本地化的评论(评论在联系人之间共享)。 Java Bean: @Audited @Entity public class User { @OneToMany(
我无法使用连接表( https://stackoverflow.com/a/7603036 和 https://en.wikibooks.org/wiki/Java_Persistence/ManyT
我有一个 Envers 查询返回一个惰性结果,尽管该字段在 hibernate 映射中定义为惰性 =“false”。 我在 Hibernate-Envers 论坛上查找过它,但没有找到任何有用的信息。
使用 JBoss Envers (4.2.0 FINAL) 注释但在尝试审计 @Enumerated 属性时失败 @Entity @Audited public class TestEntity ex
项目使用 Hibernate 3.5、Spring Webflow 2 和 Hibernate Envers 进行审计。 Envers 在 hibernate.cfg.xml 中配置。我在实体“Art
我正在我正在从事的项目中实现 Hibernate Envers,对于此客户端,数据库中的表和列必须遵循特定的名称模式。名称模式使用表名来生成部分列名,并且保存修订的表与原始表具有不同的名称(当然),因
我有一个正在运行的 ENVERs 项目,我正在完成该项目的实现,并注意到属性级别修改跟踪功能。此功能听起来非常适合我们的需求,并将取代一些(手动)表。 问题就出在这里;我在数据库中设置了字段,但当我更
我有一个 envers 查询来查找给定实体的历史记录,我想做的是使用请求中指定的谓词。 例如,我希望能够根据发送的请求按日期/用户/修订类型等(或字段组合)进行过滤。 我知道如何添加谓词,我只是想知道
跟进这三个主题: Getting the old value and new value between two revisions withHibernate Envers Diff on hibe
Doctrine 1.x 和 2 都以单独的审计表的形式提供某种 Versionable 支持,用于跟踪随时间的变化。然而,这些版本似乎是为每行使用(即,它们都维护自己的版本号)而不是数据库范围的,例
我是一名优秀的程序员,十分优秀!