HHH-10851 : Change to check for @Access on field and getter before checking the class containing the attribute

(cherry picked from commit 570577b653)
This commit is contained in:
Gail Badner 2016-06-30 00:20:42 -07:00
parent ac47825db2
commit 4f3391a592
2 changed files with 69 additions and 6 deletions

View File

@ -104,10 +104,6 @@ public class PropertyAccessMixedImpl implements PropertyAccess {
}
protected static AccessType getAccessType(Class<?> containerJavaType, String propertyName) {
AccessType classAccessType = getAccessTypeOrNull( containerJavaType );
if ( classAccessType != null ) {
return classAccessType;
}
Field field = fieldOrNull( containerJavaType, propertyName );
AccessType fieldAccessType = getAccessTypeOrNull( field );
if ( fieldAccessType != null ) {
@ -117,6 +113,11 @@ public class PropertyAccessMixedImpl implements PropertyAccess {
if ( methodAccessType != null ) {
return methodAccessType;
}
// No @Access on property or field; check to see if containerJavaType has an explicit @Access
AccessType classAccessType = getAccessTypeOrNull( containerJavaType );
if ( classAccessType != null ) {
return classAccessType;
}
return field != null ? AccessType.FIELD : AccessType.PROPERTY;
}

View File

@ -28,7 +28,7 @@ public class MixedAccessTestTask extends AbstractEnhancerTestTask {
private static boolean cleanup = false;
public Class<?>[] getAnnotatedClasses() {
return new Class<?>[]{TestEntity.class};
return new Class<?>[]{TestEntity.class, TestOtherEntity.class};
}
public void prepare() {
@ -44,6 +44,10 @@ public class MixedAccessTestTask extends AbstractEnhancerTestTask {
testEntity.setParamsAsString( "{\"paramName\":\"paramValue\"}" );
s.persist( testEntity );
TestOtherEntity testOtherEntity = new TestOtherEntity( "foo" );
testOtherEntity.setParamsAsString( "{\"paramName\":\"paramValue\"}" );
s.persist( testOtherEntity );
s.getTransaction().commit();
s.clear();
s.close();
@ -56,10 +60,13 @@ public class MixedAccessTestTask extends AbstractEnhancerTestTask {
TestEntity testEntity = s.get( TestEntity.class, "foo" );
Assert.assertEquals( "{\"paramName\":\"paramValue\"}", testEntity.getParamsAsString() );
TestOtherEntity testOtherEntity = s.get( TestOtherEntity.class, "foo" );
Assert.assertEquals( "{\"paramName\":\"paramValue\"}", testOtherEntity.getParamsAsString() );
// Clean parameters
cleanup = true;
testEntity.setParamsAsString( "{}" );
s.persist( testEntity );
testOtherEntity.setParamsAsString( "{}" );
s.getTransaction().commit();
s.clear();
@ -73,6 +80,9 @@ public class MixedAccessTestTask extends AbstractEnhancerTestTask {
TestEntity testEntity = s.get( TestEntity.class, "foo" );
Assert.assertTrue( testEntity.getParams().isEmpty() );
TestOtherEntity testOtherEntity = s.get( TestOtherEntity.class, "foo" );
Assert.assertTrue( testOtherEntity.getParams().isEmpty() );
s.getTransaction().commit();
s.clear();
s.close();
@ -128,4 +138,56 @@ public class MixedAccessTestTask extends AbstractEnhancerTestTask {
}
}
}
@Entity
@Access( AccessType.FIELD )
private static class TestOtherEntity {
@Id
String name;
@Transient
Map<String, String> params = new LinkedHashMap<>();
public TestOtherEntity(String name) {
this();
this.name = name;
}
protected TestOtherEntity() {
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
@Column( name = "params", length = 4000 )
@Access( AccessType.PROPERTY )
public String getParamsAsString() {
if ( params.size() > 0 ) {
// Convert to JSON
return "{" + params.entrySet().stream().map(
e -> "\"" + e.getKey() + "\":\"" + e.getValue() + "\""
).collect( Collectors.joining( "," ) ) + "}";
}
return null;
}
public void setParamsAsString(String string) {
params.clear();
try {
params.putAll( (Map<String, String>) engine.eval( "Java.asJSONCompatible(" + string + ")" ) );
} catch ( ScriptException ignore ) {
// JDK 8u60 required --- use hard coded values to pass the test
if ( !cleanup ) {
params.put( "paramName", "paramValue" );
}
}
}
}
}