Home >Java >javaTutorial >Hibernate Envers – Extending Revision Info with Custom Fields
This question explores how to augment the standard revision information tracked by Hibernate Envers with custom fields. Envers, by default, provides information like revision number, timestamp, and the user responsible for the change. However, often you need to store additional context-specific data alongside these standard fields. This is achieved by creating a custom revision entity that extends the default Envers revision entity. This allows you to add your own attributes, providing richer audit trails. We'll explore how to implement this effectively in the following sections.
To add custom data, you need to create a custom revision entity that extends the default Envers revision entity provided by Hibernate. Let's assume your default revision entity is org.hibernate.envers.DefaultRevisionEntity
. You would create a new entity, for example, CustomRevisionEntity
, which extends DefaultRevisionEntity
(or its equivalent, depending on your Envers version) and adds your custom fields.
<code class="java">@Entity @Audited @Table(name = "REVINFO") public class CustomRevisionEntity extends DefaultRevisionEntity { @Column(name = "application_name") private String applicationName; @Column(name = "client_ip") private String clientIp; // Add other custom fields as needed... // Getters and setters for all fields // ... }</code>
This code defines a CustomRevisionEntity
with two additional fields: applicationName
and clientIp
. Remember to add the necessary getters and setters. The @Entity
, @Audited
, and @Table
annotations are crucial for Hibernate to recognize and manage this entity as an Envers revision entity. The @Table(name = "REVINFO")
annotation assumes your revision information is stored in a table named REVINFO
. Adjust this if your table name differs.
Crucially, you need to configure Hibernate Envers to use your custom revision entity. This is typically done by setting the revisionEntityClass
property in your Hibernate configuration (e.g., hibernate.cfg.xml
or a programmatic configuration).
<code class="xml"><property name="org.hibernate.envers.revision_entity_class" value="com.yourpackage.CustomRevisionEntity" /></code>
Replace com.yourpackage.CustomRevisionEntity
with the fully qualified name of your custom revision entity. After this configuration, Envers will use your custom entity to store revision information, including your added custom fields.
Several best practices should be followed when extending Envers revision metadata:
Yes, it's entirely possible to use custom data types when extending revision information in Hibernate Envers. Your custom fields in the CustomRevisionEntity
can be of any type supported by Hibernate, including your own custom classes. However, remember that Hibernate needs to be able to persist these types. This means your custom types need to be properly mapped as Hibernate entities or value objects.
For example, if you have a custom Address
class:
<code class="java">@Entity @Audited @Table(name = "REVINFO") public class CustomRevisionEntity extends DefaultRevisionEntity { @Column(name = "application_name") private String applicationName; @Column(name = "client_ip") private String clientIp; // Add other custom fields as needed... // Getters and setters for all fields // ... }</code>
You can include an Address
field in your CustomRevisionEntity
:
<code class="xml"><property name="org.hibernate.envers.revision_entity_class" value="com.yourpackage.CustomRevisionEntity" /></code>
Remember that you'll need to ensure that the Address
class is correctly mapped as an embeddable entity using @Embeddable
annotation. This allows Hibernate to persist the address data within the CustomRevisionEntity
. For more complex types, consider using a separate table and a foreign key relationship for optimal database performance. This approach is particularly beneficial for larger or more complex custom data types.
The above is the detailed content of Hibernate Envers – Extending Revision Info with Custom Fields. For more information, please follow other related articles on the PHP Chinese website!