我从hibernate Envers 3.6移植到Envers 4.0.此新版本没有AuditEventListener.旧版本需要:听众
我找不到如何配置新版本.
我有一组域对象及其相关的表,用于应用程序的配置.经过身份验证的用户可以通过表示层更改这些域对象数据.这些 域对象具有非常重要的数据,我需要找到谁和何时更改了他们的数据.我的应用程序的数据访问层是使用JPA,Hibernate和Spring实现的.我需要记录每个更改,包括:用户+操作日期+操作类型+以前的值.
例如,让我们考虑一个简单的域对象(为了这个问题的目的简化):
@Entity
class Connection
{
private Long id;
private String name;
private String protocol;
}
Run Code Online (Sandbox Code Playgroud)
假设有一个Connection具有以下值的实例:
Connection
id = 1;
name = Web;
protocol = HTTPS;
Run Code Online (Sandbox Code Playgroud)
在用户(例如John)登录UI并将此连接更改为以下值之后:
Connection
id = 1;
name = Web;
protocol = HTTP;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,John将协议更改HTTPS为HTTP(安全协议不安全!),因此我需要将Connection实例的历史记录保存在另一个表中以便进行审计.
我为我研究了一个解决方案,并找到了以下结果:
MappedSuperClass注释,如:Create User,Create Date,Last Update User …我正在尝试使用Envers在我的Hibernate实体上设置审核.但是,我收到错误:
无法确定类型:几何,在表:Location_AUD,对于列:[org.hibernate.mapping.Column(geom)]
Hibernate很满意我在没有审核的情况下使用的几何类型,但是Envers似乎遇到了麻烦.
有谁知道Envers是否适用于Hibernate Spatial 4?如果是这样,也许有人可以用我的代码发现问题.
@Audited
@Entity
public class Location {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_LOCATION")
@SequenceGenerator(name = "SEQ_LOCATION", sequenceName = "SEQ_LOCATION", allocationSize = 1)
Long id;
@Type(type = "org.hibernate.spatial.GeometryType")
Geometry geom;
...
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Hibernate 4.2.5和HibernateSpatial 4.0.0 M1
是否可以在审计表中添加额外的列?例如我有一张这样的桌子
@Entity
@Table(name="EmpEnverPrac")
@Audited
public class EmpEnverPractice {
@Id
@Column(name="ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name="NAME")
private String name;
@Column(name="password")
@NotAudited
private String password;
// getter and setters
}
Run Code Online (Sandbox Code Playgroud)
现在我想在生成的审计表中添加一些额外的列,但我不想将它们包含在我的实体中。我无法找到满足此要求的任何解决方案。请告诉我所需的配置。提前致谢
我在我的应用程序中使用 Hibernate Envers 来存储审计跟踪数据,所有与审计相关的信息都正确存储在 *_AUD 表中。但是,所有_AUD表中rev列的数据类型都是Integer数据类型。我期待一个 big int 数据类型,因为 integer 数据类型的最大范围是 2147483647。有没有办法将数据类型更改为 big int?
跟进这三个主题:
我正在寻找一种解决方案来比较和显示两个实体修订版之间的差异(添加/编辑/删除的内容)。
假设我有如下实体:
@Entity
@Table(name = "MAIN_ENTITY")
@Audited
public class MainEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
@Column(name = "SHORT_NAME")
private String shortName;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "MAIN_ENTITY_COUNTER_ID")
private MainEntityCounter mainEntityCounter;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "mainEntity", fetch = FetchType.LAZY, orphanRemoval = true)
@JsonManagedReference
@OrderBy
private Set<Tag> tags = new HashSet<Tag>();
// getters …Run Code Online (Sandbox Code Playgroud) 我怎样才能只从被审计实体获取修改过的字段?
当我使用
AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MyEntity.class, revisionNumber).getResultList()
Run Code Online (Sandbox Code Playgroud)
我得到了所有领域;但我只想修改字段?
在我的Java应用程序中,我正在使用Hibernate Envers监听持久事件。我的侦听器类如下所示。
@Component
public class DataCreationListener extends EnversPostInsertEventListenerImpl {
private static final long serialVersionUID = 1L;
@Autowired
DataService DataService;
public DataCreationListener() {
super(null);
}
@Override
public void onPostInsert(PostInsertEvent event) {
if (event.getEntity() instanceof DataDAO) {
Data Data = DataService.fromDao((DataDAO) event.getEntity());
// other stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
在该fromDAO方法中,我将DAO(实体类型)对象转换为api类型对象。这是fromDAO方法
@Override
public Data fromDao(DataDAO data) {
if (data == null) {
return null;
}
Data api = new Data();
api.setId(data.getIdUser());
api.setAddress(data.getAddress());
api.setCity(data.getCity());
api.setCountry(getCountryFromId(data.getId()));
return api;
}
Run Code Online (Sandbox Code Playgroud)
执行时发生错误 …
我正在使用 Spring Data REST 开发 RESTful API。现在进行审计,Spring 确实可以选择审计元数据created_date,modified_date但它们不提供实体版本控制。
目前有两个流行的实体版本库,分别是 Envers 和 Javers。我已经查看了两者的比较,但没有关于这个问题的任何文章。
那么使用 Javers 而不使用 Envers 有哪些优点和缺点呢?
我想写关于修订的测试。在控制台中,我看到 Hibernate 的更新调用,但没有插入 AUD-Table。
测试方法:
@DataJpaTest
class JPAHistoryTest {
@Test
public void test() {
def entity = // create Entity
def entity2 = // create same Entity
entity2.setPrice(entity2.getPrice() + 10)
entity2.setLastUpdate(entity2.lastUpdate.plusSeconds(10))
service.save(entity)
service.save(entity2)
repository.flush() // Hibernate updates changes
assert repository.findRevisions(entity.id).content.empty == false // FAIL!
}
}
Run Code Online (Sandbox Code Playgroud)
我的实体看起来像:
@Entity
@Audited
class Entity {
@Id @GeneratedValue Long id
@Column(nullable = false) BigDecimal price
}
Run Code Online (Sandbox Code Playgroud)
非常感谢。