Skip to content

Commit 6f6b326

Browse files
moriarty-s3abrmeyer
authored andcommitted
HHH-9043
Added the ability to customize the modified field name for audited fields.
1 parent 3cc8cb3 commit 6f6b326

File tree

8 files changed

+164
-16
lines changed

8 files changed

+164
-16
lines changed

hibernate-envers/src/main/java/org/hibernate/envers/Audited.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,10 @@
7373
* This can be used for example in queries.
7474
*/
7575
boolean withModifiedFlag() default false;
76+
77+
/**
78+
* The column name of the modified field. Analogous to the name attribute of the @{@link javax.persistence.Column}
79+
* annotation. Ignored if withModifiedFlag is false.
80+
*/
81+
String modifiedColumnName() default "";
7682
}

hibernate-envers/src/main/java/org/hibernate/envers/configuration/internal/metadata/AuditMetadataGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ private Element cloneAndSetupRevisionInfoRelationMapping() {
141141
revMapping.addAttribute( "name", verEntCfg.getRevisionFieldName() );
142142
if ( globalCfg.isCascadeDeleteRevision() ) {
143143
revMapping.addAttribute( "on-delete", "cascade" );
144-
}
144+
}
145145

146146
MetadataTools.addOrModifyColumn( revMapping, verEntCfg.getRevisionFieldName() );
147147

@@ -325,7 +325,8 @@ private void addModifiedFlagIfNeeded(
325325
MetadataTools.addModifiedFlagProperty(
326326
parent,
327327
propertyAuditingData.getName(),
328-
globalCfg.getModifiedFlagSuffix()
328+
globalCfg.getModifiedFlagSuffix(),
329+
propertyAuditingData.getModifiedFlagName()
329330
);
330331
}
331332
}

hibernate-envers/src/main/java/org/hibernate/envers/configuration/internal/metadata/MetadataTools.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ public static Element addProperty(Element parent, String name, String type, bool
101101
return addProperty( parent, name, type, insertable, false, key );
102102
}
103103

104-
public static Element addModifiedFlagProperty(Element parent, String propertyName, String suffix) {
104+
public static Element addModifiedFlagProperty(Element parent, String propertyName, String suffix, String modifiedFlagName) {
105105
return addProperty(
106106
parent,
107-
getModifiedFlagPropertyName( propertyName, suffix ),
107+
(modifiedFlagName != null) ? modifiedFlagName : getModifiedFlagPropertyName( propertyName, suffix ),
108108
"boolean",
109109
true,
110110
false,

hibernate-envers/src/main/java/org/hibernate/envers/configuration/internal/metadata/reader/AuditedPropertiesReader.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -518,19 +518,12 @@ private boolean fillPropertyData(
518518
}
519519
}
520520

521-
522-
if ( !this.checkAudited( property, propertyData, allClassAudited ) ) {
521+
final String propertyName = propertyNamePrefix + property.getName();
522+
if ( !this.checkAudited( property, propertyData,propertyName, allClassAudited, globalCfg.getModifiedFlagSuffix() ) ) {
523523
return false;
524524
}
525525

526-
final String propertyName = propertyNamePrefix + property.getName();
527526
propertyData.setName( propertyName );
528-
propertyData.setModifiedFlagName(
529-
MetadataTools.getModifiedFlagPropertyName(
530-
propertyName,
531-
globalCfg.getModifiedFlagSuffix()
532-
)
533-
);
534527
propertyData.setBeanName( property.getName() );
535528
propertyData.setAccessType( accessType );
536529

@@ -550,7 +543,8 @@ private boolean fillPropertyData(
550543

551544
protected boolean checkAudited(
552545
XProperty property,
553-
PropertyAuditingData propertyData, Audited allClassAudited) {
546+
PropertyAuditingData propertyData, String propertyName,
547+
Audited allClassAudited, String modifiedFlagSuffix) {
554548
// Checking if this property is explicitly audited or if all properties are.
555549
Audited aud = ( property.isAnnotationPresent( Audited.class ) )
556550
? property.getAnnotation( Audited.class )
@@ -566,6 +560,13 @@ protected boolean checkAudited(
566560
propertyData.setStore( aud.modStore() );
567561
propertyData.setRelationTargetAuditMode( aud.targetAuditMode() );
568562
propertyData.setUsingModifiedFlag( checkUsingModifiedFlag( aud ) );
563+
if(aud.modifiedColumnName() != null && !"".equals(aud.modifiedColumnName())) {
564+
propertyData.setModifiedFlagName(aud.modifiedColumnName());
565+
} else {
566+
propertyData.setModifiedFlagName(
567+
MetadataTools.getModifiedFlagPropertyName(propertyName, modifiedFlagSuffix)
568+
);
569+
}
569570
return true;
570571
}
571572
else {
@@ -682,6 +683,11 @@ public boolean withModifiedFlag() {
682683
return false;
683684
}
684685

686+
@Override
687+
public String modifiedColumnName() {
688+
return "";
689+
}
690+
685691
@Override
686692
public Class<? extends Annotation> annotationType() {
687693
return this.getClass();

hibernate-envers/src/main/java/org/hibernate/envers/configuration/internal/metadata/reader/ComponentAuditedPropertiesReader.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.hibernate.envers.Audited;
2929
import org.hibernate.envers.ModificationStore;
3030
import org.hibernate.envers.configuration.internal.GlobalConfiguration;
31+
import org.hibernate.envers.configuration.internal.metadata.MetadataTools;
3132

3233
/**
3334
* Reads the audited properties for components.
@@ -52,14 +53,21 @@ public ComponentAuditedPropertiesReader(
5253
@Override
5354
protected boolean checkAudited(
5455
XProperty property,
55-
PropertyAuditingData propertyData,
56-
Audited allClassAudited) {
56+
PropertyAuditingData propertyData, String propertyName,
57+
Audited allClassAudited, String modifiedFlagSuffix) {
5758
// Checking if this property is explicitly audited or if all properties are.
5859
final Audited aud = property.getAnnotation( Audited.class );
5960
if ( aud != null ) {
6061
propertyData.setStore( aud.modStore() );
6162
propertyData.setRelationTargetAuditMode( aud.targetAuditMode() );
6263
propertyData.setUsingModifiedFlag( checkUsingModifiedFlag( aud ) );
64+
if(aud.modifiedColumnName() != null && !"".equals(aud.modifiedColumnName())) {
65+
propertyData.setModifiedFlagName(aud.modifiedColumnName());
66+
} else {
67+
propertyData.setModifiedFlagName(
68+
MetadataTools.getModifiedFlagPropertyName( propertyName, modifiedFlagSuffix )
69+
);
70+
}
6371
}
6472
else {
6573
propertyData.setStore( ModificationStore.FULL );

hibernate-envers/src/main/java/org/hibernate/envers/configuration/internal/metadata/reader/PropertyAuditingData.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ public void setUsingModifiedFlag(boolean usingModifiedFlag) {
170170
this.usingModifiedFlag = usingModifiedFlag;
171171
}
172172

173+
public String getModifiedFlagName() {
174+
return modifiedFlagName;
175+
}
176+
173177
public void setModifiedFlagName(String modifiedFlagName) {
174178
this.modifiedFlagName = modifiedFlagName;
175179
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.hibernate.envers.test.integration.naming;
2+
3+
import java.util.List;
4+
import javax.persistence.EntityManager;
5+
import javax.persistence.Query;
6+
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
7+
import org.hibernate.envers.test.Priority;
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
11+
public class AuditColumnNameTest extends BaseEnversJPAFunctionalTestCase {
12+
private Integer id;
13+
14+
@Override
15+
protected Class<?>[] getAnnotatedClasses() {
16+
return new Class[] {NamingTestEntity2.class};
17+
}
18+
19+
@Test
20+
@Priority(10)
21+
public void initData() {
22+
NamingTestEntity2 nte1 = new NamingTestEntity2("data1" );
23+
EntityManager em = getEntityManager();
24+
em.getTransaction().begin();
25+
em.persist( nte1 );
26+
em.getTransaction().commit();
27+
this.id = nte1.getId();
28+
}
29+
30+
@Test
31+
public void testColumnName() {
32+
EntityManager em = getEntityManager();
33+
em.getTransaction().begin();
34+
Query query = em.createNativeQuery(
35+
"select nte_data, data_MOD_different from naming_test_entity_2_versions where nte_id = :nteId");
36+
query.setParameter("nteId", this.id);
37+
List<Object[]> resultList = query.getResultList();
38+
Assert.assertNotNull(resultList);
39+
Assert.assertTrue(resultList.size() > 0);
40+
Object[] result = resultList.get(0);
41+
Assert.assertEquals(result.length, 2);
42+
em.getTransaction().commit();
43+
}
44+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.hibernate.envers.test.integration.naming;
2+
3+
import javax.persistence.Column;
4+
import javax.persistence.Entity;
5+
import javax.persistence.GeneratedValue;
6+
import javax.persistence.Id;
7+
import javax.persistence.Table;
8+
import org.hibernate.envers.AuditTable;
9+
import org.hibernate.envers.Audited;
10+
11+
@Entity
12+
@Table(name = "naming_test_entity_2")
13+
@AuditTable("naming_test_entity_2_versions")
14+
public class NamingTestEntity2 {
15+
@Id
16+
@GeneratedValue
17+
@Column(name = "nte_id")
18+
@Audited(withModifiedFlag = true)
19+
private Integer id;
20+
21+
@Column(name = "nte_data")
22+
@Audited(withModifiedFlag = true, modifiedColumnName = "data_MOD_different")
23+
private String data;
24+
25+
public NamingTestEntity2() {
26+
}
27+
28+
public NamingTestEntity2(String data) {
29+
this.data = data;
30+
}
31+
32+
public NamingTestEntity2(Integer id, String data) {
33+
this.id = id;
34+
this.data = data;
35+
}
36+
37+
public Integer getId() {
38+
return id;
39+
}
40+
41+
public void setId(Integer id) {
42+
this.id = id;
43+
}
44+
45+
public String getData() {
46+
return data;
47+
}
48+
49+
public void setData(String data) {
50+
this.data = data;
51+
}
52+
53+
public boolean equals(Object o) {
54+
if ( this == o ) {
55+
return true;
56+
}
57+
if ( !(o instanceof NamingTestEntity2) ) {
58+
return false;
59+
}
60+
61+
NamingTestEntity2 that = (NamingTestEntity2) o;
62+
63+
if ( data != null ? !data.equals( that.data ) : that.data != null ) {
64+
return false;
65+
}
66+
if ( id != null ? !id.equals( that.id ) : that.id != null ) {
67+
return false;
68+
}
69+
70+
return true;
71+
}
72+
73+
public int hashCode() {
74+
int result;
75+
result = (id != null ? id.hashCode() : 0);
76+
result = 31 * result + (data != null ? data.hashCode() : 0);
77+
return result;
78+
}
79+
}

0 commit comments

Comments
 (0)