HHH-13770 Fix modified columns being populated with null values
This commit is contained in:
parent
b3ea1d67c4
commit
8c52eb2eae
|
@ -40,10 +40,11 @@ public class LegacyModifiedColumnNamingStrategy implements ModifiedColumnNamingS
|
|||
else {
|
||||
columnName = propertyAuditingData.getModifiedFlagName();
|
||||
}
|
||||
MetadataTools.addModifiedFlagProperty(
|
||||
MetadataTools.addModifiedFlagPropertyWithColumn(
|
||||
parent,
|
||||
propertyAuditingData.getName(),
|
||||
globalCfg.getModifiedFlagSuffix(),
|
||||
propertyAuditingData.getModifiedFlagName(),
|
||||
columnName
|
||||
);
|
||||
}
|
||||
|
|
|
@ -591,7 +591,7 @@ public class AuditedPropertiesReader {
|
|||
propertyData.setRelationTargetAuditMode( aud.targetAuditMode() );
|
||||
propertyData.setUsingModifiedFlag( checkUsingModifiedFlag( aud ) );
|
||||
propertyData.setModifiedFlagName( MetadataTools.getModifiedFlagPropertyName( propertyName, modifiedFlagSuffix ) );
|
||||
if( aud.modifiedColumnName() != null && !"".equals( aud.modifiedColumnName() ) ) {
|
||||
if ( !StringTools.isEmpty( aud.modifiedColumnName() ) ) {
|
||||
propertyData.setExplicitModifiedFlagName( aud.modifiedColumnName() );
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -14,8 +14,12 @@ import org.hibernate.envers.test.Priority;
|
|||
import org.hibernate.envers.test.integration.auditReader.AuditedTestEntity;
|
||||
import org.hibernate.envers.test.integration.auditReader.NotAuditedTestEntity;
|
||||
|
||||
import org.hibernate.envers.test.integration.modifiedflags.entities.EnumEntity;
|
||||
import org.hibernate.envers.test.integration.modifiedflags.entities.EnumOption;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
|
||||
|
@ -28,7 +32,7 @@ import static junit.framework.Assert.assertTrue;
|
|||
public class HasChangedAPITest extends AbstractModifiedFlagsEntityTest {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class[] {AuditedTestEntity.class, NotAuditedTestEntity.class};
|
||||
return new Class[] {AuditedTestEntity.class, NotAuditedTestEntity.class, EnumEntity.class};
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -38,17 +42,22 @@ public class HasChangedAPITest extends AbstractModifiedFlagsEntityTest {
|
|||
em.getTransaction().begin();
|
||||
AuditedTestEntity ent1 = new AuditedTestEntity( 1, "str1" );
|
||||
NotAuditedTestEntity ent2 = new NotAuditedTestEntity( 1, "str1" );
|
||||
EnumEntity ent3 = new EnumEntity( 1, EnumOption.A );
|
||||
|
||||
|
||||
em.persist( ent1 );
|
||||
em.persist( ent2 );
|
||||
em.persist( ent3 );
|
||||
em.getTransaction().commit();
|
||||
|
||||
em.getTransaction().begin();
|
||||
|
||||
ent1 = em.find( AuditedTestEntity.class, 1 );
|
||||
ent2 = em.find( NotAuditedTestEntity.class, 1 );
|
||||
ent3 = em.find( EnumEntity.class, 1 );
|
||||
ent1.setStr1( "str2" );
|
||||
ent2.setStr1( "str2" );
|
||||
ent3.setOption( EnumOption.B );
|
||||
em.getTransaction().commit();
|
||||
}
|
||||
|
||||
|
@ -65,4 +74,18 @@ public class HasChangedAPITest extends AbstractModifiedFlagsEntityTest {
|
|||
assertTrue( list.isEmpty() );
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-13770")
|
||||
public void testHasChangedHasNotChangedEnum() {
|
||||
List list = getAuditReader().createQuery().forRevisionsOfEntity( EnumEntity.class, true, true )
|
||||
.add( AuditEntity.property( "option" ).hasChanged() ).getResultList();
|
||||
assertEquals( 2, list.size() );
|
||||
assertEquals( EnumOption.A, ( (EnumEntity) list.get( 0 ) ).getOption() );
|
||||
assertEquals( EnumOption.B, ( (EnumEntity) list.get( 1 ) ).getOption() );
|
||||
|
||||
list = getAuditReader().createQuery().forRevisionsOfEntity( EnumEntity.class, true, true )
|
||||
.add( AuditEntity.property( "option" ).hasNotChanged() ).getResultList();
|
||||
assertTrue( list.isEmpty() );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.envers.test.integration.modifiedflags.entities;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.Id;
|
||||
|
||||
import org.hibernate.envers.Audited;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@Entity
|
||||
@Audited
|
||||
public class EnumEntity {
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "client_option")
|
||||
@Audited(modifiedColumnName = "client_option_mod")
|
||||
private EnumOption option;
|
||||
|
||||
EnumEntity() {
|
||||
|
||||
}
|
||||
|
||||
public EnumEntity(Integer id, EnumOption option) {
|
||||
this.id = id;
|
||||
this.option = option;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public EnumOption getOption() {
|
||||
return option;
|
||||
}
|
||||
|
||||
public void setOption(EnumOption option) {
|
||||
this.option = option;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.envers.test.integration.modifiedflags.entities;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
public enum EnumOption {
|
||||
A,
|
||||
B,
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.envers.test.integration.modifiedflags.naming;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
public enum ClientOption {
|
||||
A,
|
||||
B
|
||||
}
|
|
@ -44,6 +44,8 @@ public class ImprovedColumnNamingStrategyTest extends BaseEnversJPAFunctionalTes
|
|||
assertNotNull( table1.getColumn( new Column( "otherEntity_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "single_id_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "singleIdEntity2_id_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "client_option_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "cop_mod" ) ) );
|
||||
|
||||
final Table table2 = metadata().getEntityBinding( OtherEntity.class.getName() + "_AUD" ).getTable();
|
||||
assertNotNull( table2.getColumn( new Column( "d_MOD" ) ) );
|
||||
|
|
|
@ -34,6 +34,8 @@ public class LegacyColumnNamingStrategyTest extends BaseEnversJPAFunctionalTestC
|
|||
assertNotNull( table1.getColumn( new Column( "otherEntity_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "singleIdEntity_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "singleIdEntity2_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "clientOption_MOD" ) ) );
|
||||
assertNotNull( table1.getColumn( new Column( "cop_mod" ) ) );
|
||||
|
||||
final Table table2 = metadata().getEntityBinding( OtherEntity.class.getName() + "_AUD" ).getTable();
|
||||
assertNotNull( table2.getColumn( new Column( "data_MOD" ) ) );
|
||||
|
|
|
@ -8,8 +8,9 @@ package org.hibernate.envers.test.integration.modifiedflags.naming;
|
|||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embedded;
|
||||
import javax.persistence.EmbeddedId;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
|
@ -52,6 +53,15 @@ public class TestEntity {
|
|||
@OneToOne
|
||||
private SingleIdEntity singleIdEntity2;
|
||||
|
||||
@Column(name = "client_option")
|
||||
@Enumerated(EnumType.STRING)
|
||||
private ClientOption clientOption;
|
||||
|
||||
@Column(name = "client_option2")
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Audited(withModifiedFlag = true, modifiedColumnName = "cop_mod")
|
||||
private ClientOption clientOption2;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
@ -123,4 +133,20 @@ public class TestEntity {
|
|||
public void setSingleIdEntity2(SingleIdEntity singleIdEntity2) {
|
||||
this.singleIdEntity2 = singleIdEntity2;
|
||||
}
|
||||
|
||||
public ClientOption getClientOption() {
|
||||
return clientOption;
|
||||
}
|
||||
|
||||
public void setClientOption(ClientOption clientOption) {
|
||||
this.clientOption = clientOption;
|
||||
}
|
||||
|
||||
public ClientOption getClientOption2() {
|
||||
return clientOption2;
|
||||
}
|
||||
|
||||
public void setClientOption2(ClientOption clientOption2) {
|
||||
this.clientOption2 = clientOption2;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue