4
4
*/
5
5
package org .hibernate .envers .internal .entities .mapper .id ;
6
6
7
+ import java .lang .reflect .Constructor ;
8
+ import java .util .HashMap ;
7
9
import java .util .Map ;
8
10
9
11
import org .hibernate .envers .exception .AuditException ;
@@ -46,6 +48,10 @@ public Object mapToIdFromMap(Map data) {
46
48
return null ;
47
49
}
48
50
51
+ if ( compositeIdClass .isRecord () ) {
52
+ return mapToRecordFromMap ( data );
53
+ }
54
+
49
55
final Object compositeId = instantiateCompositeId ();
50
56
for ( AbstractIdMapper mapper : ids .values () ) {
51
57
if ( !mapper .mapToEntityFromMap ( compositeId , data ) ) {
@@ -56,6 +62,36 @@ public Object mapToIdFromMap(Map data) {
56
62
return compositeId ;
57
63
}
58
64
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
+
59
95
@ Override
60
96
public void mapToEntityFromEntity (Object objectTo , Object objectFrom ) {
61
97
// no-op; does nothing
0 commit comments