Skip to content

Commit 242053e

Browse files
committed
HHH-19393 WIP : Possible (simplified) fix
1 parent a8005ce commit 242053e

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

hibernate-envers/src/main/java/org/hibernate/envers/internal/entities/mapper/id/AbstractCompositeIdMapper.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package org.hibernate.envers.internal.entities.mapper.id;
66

7+
import java.lang.reflect.Constructor;
8+
import java.util.HashMap;
79
import java.util.Map;
810

911
import org.hibernate.envers.exception.AuditException;
@@ -46,6 +48,10 @@ public Object mapToIdFromMap(Map data) {
4648
return null;
4749
}
4850

51+
if ( compositeIdClass.isRecord() ) {
52+
return mapToRecordFromMap( data );
53+
}
54+
4955
final Object compositeId = instantiateCompositeId();
5056
for ( AbstractIdMapper mapper : ids.values() ) {
5157
if ( !mapper.mapToEntityFromMap( compositeId, data ) ) {
@@ -56,6 +62,36 @@ public Object mapToIdFromMap(Map data) {
5662
return compositeId;
5763
}
5864

65+
protected Object mapToRecordFromMap(Map data) {
66+
final var map = new HashMap<String, Object>();
67+
for ( AbstractIdMapper mapper : ids.values() ) {
68+
if ( !(mapper instanceof SingleIdMapper single && single.mapToMapFromMap( map, data )) ) {
69+
return null;
70+
}
71+
}
72+
return recordFromMap( map );
73+
}
74+
75+
protected Object recordFromMap(Map<String, Object> map) {
76+
final var recordComponents = compositeIdClass.getRecordComponents();
77+
final var constructoryTypes = new Class[recordComponents.length];
78+
final var constructoryParameters = new Object[recordComponents.length];
79+
for ( var i = 0; i < recordComponents.length; ++i ) {
80+
constructoryTypes[i] = recordComponents[i].getType();
81+
if ( !map.containsKey( recordComponents[i].getName() ) ) {
82+
return null;
83+
}
84+
constructoryParameters[i] = map.get( recordComponents[i].getName() );
85+
}
86+
try {
87+
final Constructor<?> idClassConstructor = compositeIdClass.getConstructor( constructoryTypes );
88+
return idClassConstructor.newInstance( constructoryParameters );
89+
}
90+
catch (ReflectiveOperationException e) {
91+
return null;
92+
}
93+
}
94+
5995
@Override
6096
public void mapToEntityFromEntity(Object objectTo, Object objectFrom) {
6197
// no-op; does nothing

hibernate-envers/src/main/java/org/hibernate/envers/internal/entities/mapper/id/EmbeddedIdMapper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,17 @@ public boolean mapToEntityFromMap(final Object obj, final Map data) {
5858

5959
final Setter setter = ReflectionTools.getSetter( obj.getClass(), idPropertyData, getServiceRegistry() );
6060
try {
61+
if ( compositeIdClass.isRecord() ) {
62+
final var subObj = mapToRecordFromMap( data );
63+
if ( subObj == null ) {
64+
return false;
65+
}
66+
else {
67+
setter.set( obj, subObj );
68+
return true;
69+
}
70+
}
71+
6172
final Object subObj = instantiateCompositeId();
6273

6374
boolean ret = true;

hibernate-envers/src/main/java/org/hibernate/envers/internal/entities/mapper/id/SingleIdMapper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ public boolean mapToEntityFromMap(final Object obj, Map data) {
6262
return true;
6363
}
6464

65+
boolean mapToMapFromMap(Map<String, Object> map, Map data) {
66+
if ( data == null || map == null ) {
67+
return false;
68+
}
69+
70+
final Object value = data.get( propertyData.getName() );
71+
if ( value == null ) {
72+
return false;
73+
}
74+
75+
map.put( propertyData.getName(), value );
76+
return true;
77+
}
78+
6579
@Override
6680
public Object mapToIdFromMap(Map data) {
6781
if ( data == null ) {

0 commit comments

Comments
 (0)