2222import org .seasar .doma .internal .apt .meta .id .TableIdGeneratorMeta ;
2323import org .seasar .doma .jdbc .Naming ;
2424import org .seasar .doma .jdbc .entity .AbstractEntityType ;
25+ import org .seasar .doma .jdbc .entity .EmbeddedPropertyType ;
2526import org .seasar .doma .jdbc .entity .EntityPropertyType ;
2627import org .seasar .doma .jdbc .entity .GeneratedIdPropertyType ;
2728import org .seasar .doma .jdbc .entity .NamingType ;
@@ -87,7 +88,6 @@ private void printFields() {
8788 printOriginalStatesAccessorField ();
8889 printNamingTypeField ();
8990 printIdGeneratorField ();
90- printPropertyTypeFields ();
9191 printListenerSupplierField ();
9292 printImmutableField ();
9393 printCatalogNameField ();
@@ -98,6 +98,7 @@ private void printFields() {
9898 printIdPropertyTypesField ();
9999 printEntityPropertyTypesField ();
100100 printEntityPropertyTypeMapField ();
101+ printEmbeddedPropertyTypeMapField ();
101102 }
102103
103104 private void printSingletonField () {
@@ -127,15 +128,6 @@ private void printIdGeneratorField() {
127128 }
128129 }
129130
130- private void printPropertyTypeFields () {
131- for (EntityPropertyMeta pm : entityMeta .getAllPropertyMetas ()) {
132- EntityTypePropertyGenerator propertyGenerator =
133- new EntityTypePropertyGenerator (ctx , className , printer , entityMeta , pm );
134- propertyGenerator .generate ();
135- print ("%n" );
136- }
137- }
138-
139131 private void printListenerSupplierField () {
140132 if (entityMeta .isGenericEntityListener ()) {
141133 iprint (
@@ -210,6 +202,16 @@ private void printEntityPropertyTypeMapField() {
210202 print ("%n" );
211203 }
212204
205+ private void printEmbeddedPropertyTypeMapField () {
206+ if (!entityMeta .hasEmbeddedProperties ()) {
207+ iprint ("@SuppressWarnings(\" unused\" )%n" );
208+ }
209+ iprint (
210+ "private final java.util.Map<String, %1$s<%2$s, ?>> __embeddedPropertyTypeMap;%n" ,
211+ EmbeddedPropertyType .class , entityMeta .getType ());
212+ print ("%n" );
213+ }
214+
213215 private void printConstructor () {
214216 iprint ("private %1$s() {%n" , simpleName );
215217 iprint (" __listenerSupplier = () -> ListenerHolder.listener;%n" );
@@ -228,30 +230,31 @@ private void printConstructor() {
228230 /* 2 */ entityMeta .getType (),
229231 /* 3 */ entityMeta .getAllPropertyMetas ().size ());
230232 iprint (
231- " java.util.Map<String, %1$s<%2$s, ?>> __map = new java.util.HashMap <>(%3$s);%n" ,
233+ " java.util.Map<String, %1$s<%2$s, ?>> __map = new java.util.LinkedHashMap <>(%3$s);%n" ,
232234 /* 1 */ EntityPropertyType .class ,
233235 /* 2 */ entityMeta .getType (),
234236 /* 3 */ entityMeta .getAllPropertyMetas ().size ());
235- for (EntityPropertyMeta pm : entityMeta .getAllPropertyMetas ()) {
236- if (pm .isEmbedded ()) {
237- iprint (" __list.addAll(%1$s.getEmbeddablePropertyTypes());%n" , pm .getFieldName ());
238- iprint (" __map.putAll(%1$s.getEmbeddablePropertyTypeMap());%n" , pm .getFieldName ());
239- } else {
240- if (pm .isId ()) {
241- iprint (" __idList.add(%1$s);%n" , pm .getFieldName ());
242- }
243- iprint (" __list.add(%1$s);%n" , pm .getFieldName ());
244- iprint (" __map.put(\" %1$s\" , %2$s);%n" , pm .getName (), pm .getFieldName ());
245- }
246- }
237+ iprint (
238+ " java.util.Map<String, %1$s<%2$s, ?>> __embeddedMap = new java.util.LinkedHashMap<>(%3$s);%n" ,
239+ /* 1 */ EmbeddedPropertyType .class ,
240+ /* 2 */ entityMeta .getType (),
241+ /* 3 */ entityMeta .getAllPropertyMetas ().size ());
242+ iprint (" initializeMaps(__map, __embeddedMap);%n" );
243+ iprint (" initializeIdList(__map, __idList);%n" );
244+ iprint (" initializeList(__map, __list);%n" );
247245 iprint (" __idPropertyTypes = java.util.Collections.unmodifiableList(__idList);%n" );
248246 iprint (" __entityPropertyTypes = java.util.Collections.unmodifiableList(__list);%n" );
249247 iprint (" __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map);%n" );
248+ iprint (
249+ " __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap);%n" );
250250 iprint ("}%n" );
251251 print ("%n" );
252252 }
253253
254254 private void printMethods () {
255+ printInitializeMapsMethod ();
256+ printInitializeIdListMethod ();
257+ printInitializeListMethod ();
255258 printGetNamingTypeMethod ();
256259 printIsImmutableMethod ();
257260 printGetNameMethod ();
@@ -279,6 +282,58 @@ private void printMethods() {
279282 printNewInstanceMethod ();
280283 }
281284
285+ private void printInitializeMapsMethod () {
286+ iprint (
287+ "private void initializeMaps(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.Map<String, %3$s<%2$s, ?>> __embeddedMap) {%n" ,
288+ /* 1 */ EntityPropertyType .class ,
289+ /* 2 */ entityMeta .getType (),
290+ /* 3 */ EmbeddedPropertyType .class );
291+ indent ();
292+ for (EntityPropertyMeta pm : entityMeta .getAllPropertyMetas ()) {
293+ EntityTypePropertyGenerator propertyGenerator =
294+ new EntityTypePropertyGenerator (ctx , className , printer , entityMeta , pm );
295+ if (pm .isEmbedded ()) {
296+ iprint ("__embeddedMap.put(\" %1$s\" , " , pm .getName ());
297+ propertyGenerator .generate ();
298+ print (");%n" );
299+ iprint (
300+ "__map.putAll(__embeddedMap.get(\" %1$s\" ).getEmbeddablePropertyTypeMap());%n" ,
301+ pm .getName ());
302+ } else {
303+ iprint ("__map.put(\" %1$s\" , " , pm .getName ());
304+ propertyGenerator .generate ();
305+ print (");%n" );
306+ }
307+ }
308+ unindent ();
309+ iprint ("}%n" );
310+ print ("%n" );
311+ }
312+
313+ private void printInitializeIdListMethod () {
314+ iprint (
315+ "private void initializeIdList(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.List<%1$s<%2$s, ?>> __idList) {%n" ,
316+ EntityPropertyType .class , entityMeta .getType ());
317+ indent ();
318+ for (EntityPropertyMeta pm : entityMeta .getIdPropertyMetas ()) {
319+ iprint ("__idList.add(__map.get(\" %1$s\" ));%n" , pm .getName ());
320+ }
321+ unindent ();
322+ iprint ("}%n" );
323+ print ("%n" );
324+ }
325+
326+ private void printInitializeListMethod () {
327+ iprint (
328+ "private void initializeList(java.util.Map<String, %1$s<%2$s, ?>> __map, java.util.List<%1$s<%2$s, ?>> __list) {%n" ,
329+ EntityPropertyType .class , entityMeta .getType ());
330+ indent ();
331+ iprint ("__list.addAll(__map.values());%n" );
332+ unindent ();
333+ iprint ("}%n" );
334+ print ("%n" );
335+ }
336+
282337 private void printGetNamingTypeMethod () {
283338 iprint ("@Override%n" );
284339 iprint ("public %1$s getNamingType() {%n" , NamingType .class );
@@ -451,13 +506,16 @@ private void printGetGeneratedIdPropertyTypeMethod() {
451506 String idName = "null" ;
452507 if (entityMeta .hasGeneratedIdPropertyMeta ()) {
453508 EntityPropertyMeta pm = entityMeta .getGeneratedIdPropertyMeta ();
454- idName = pm .getFieldName ();
509+ idName = pm .getName ();
455510 }
511+ iprint ("@SuppressWarnings(\" unchecked\" )%n" );
456512 iprint ("@Override%n" );
457513 iprint (
458514 "public %1$s<%2$s, ?, ?> getGeneratedIdPropertyType() {%n" ,
459515 GeneratedIdPropertyType .class , entityMeta .getType ());
460- iprint (" return %1$s;%n" , idName );
516+ iprint (
517+ " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\" %3$s\" );%n" ,
518+ GeneratedIdPropertyType .class , entityMeta .getType (), idName );
461519 iprint ("}%n" );
462520 print ("%n" );
463521 }
@@ -466,13 +524,16 @@ private void printGetVersionPropertyTypeMethod() {
466524 String versionName = "null" ;
467525 if (entityMeta .hasVersionPropertyMeta ()) {
468526 EntityPropertyMeta pm = entityMeta .getVersionPropertyMeta ();
469- versionName = pm .getFieldName ();
527+ versionName = pm .getName ();
470528 }
529+ iprint ("@SuppressWarnings(\" unchecked\" )%n" );
471530 iprint ("@Override%n" );
472531 iprint (
473532 "public %1$s<%2$s, ?, ?> getVersionPropertyType() {%n" ,
474533 VersionPropertyType .class , entityMeta .getType ());
475- iprint (" return %1$s;%n" , versionName );
534+ iprint (
535+ " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\" %3$s\" );%n" ,
536+ VersionPropertyType .class , entityMeta .getType (), versionName );
476537 iprint ("}%n" );
477538 print ("%n" );
478539 }
@@ -481,19 +542,23 @@ private void printGetTenantIdPropertyTypeMethod() {
481542 String tenantIdName = "null" ;
482543 if (entityMeta .hasTenantIdPropertyMeta ()) {
483544 EntityPropertyMeta pm = entityMeta .getTenantIdPropertyMeta ();
484- tenantIdName = pm .getFieldName ();
545+ tenantIdName = pm .getName ();
485546 }
547+ iprint ("@SuppressWarnings(\" unchecked\" )%n" );
486548 iprint ("@Override%n" );
487549 iprint (
488550 "public %1$s<%2$s, ?, ?> getTenantIdPropertyType() {%n" ,
489551 TenantIdPropertyType .class , entityMeta .getType ());
490- iprint (" return %1$s;%n" , tenantIdName );
552+ iprint (
553+ " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\" %3$s\" );%n" ,
554+ TenantIdPropertyType .class , entityMeta .getType (), tenantIdName );
491555 iprint ("}%n" );
492556 print ("%n" );
493557 }
494558
495559 private void printNewEntityMethod () {
496- if (hasGenericTypeProperty ()) {
560+ if (hasGenericTypeProperty ()
561+ || (!entityMeta .isImmutable () && entityMeta .hasEmbeddedProperties ())) {
497562 iprint ("@SuppressWarnings(\" unchecked\" )%n" );
498563 }
499564 iprint ("@Override%n" );
@@ -547,10 +612,13 @@ protected Void defaultAction(CtType ctType, Void aVoid)
547612 public Void visitEmbeddableCtType (EmbeddableCtType ctType , Void aVoid )
548613 throws RuntimeException {
549614 iprint (
550- " %1$s.save(entity, %2$s.newEmbeddable(\" %3$s\" , __args));%n" ,
551- propertyMeta .getFieldName (),
552- ctType .getDescCode (),
553- propertyMeta .getName ());
615+ " ((%4$s<%5$s, %6$s>)__embeddedPropertyTypeMap.get(\" %1$s\" )).save(entity, %2$s.newEmbeddable(\" %3$s\" , __args));%n" ,
616+ /* 1 */ propertyMeta .getName (),
617+ /* 2 */ ctType .getDescCode (),
618+ /* 3 */ propertyMeta .getName (),
619+ /* 4 */ EmbeddedPropertyType .class ,
620+ /* 5 */ entityMeta .getType (),
621+ /* 6 */ ctType .getType ());
554622 return null ;
555623 }
556624
@@ -612,7 +680,9 @@ private void printSaveCurrentStatesMethod() {
612680 if (!entityMeta .isAbstract () && entityMeta .hasOriginalStatesMeta ()) {
613681 iprint (" %1$s __currentStates = new %1$s();%n" , entityMeta .getType ());
614682 for (EntityPropertyMeta pm : entityMeta .getAllPropertyMetas ()) {
615- iprint (" %1$s.copy(__currentStates, __entity);%n" , pm .getFieldName ());
683+ iprint (
684+ " (__entityPropertyTypeMap.get(\" %1$s\" )).copy(__currentStates, __entity);%n" ,
685+ pm .getName ());
616686 }
617687 iprint (" __originalStatesAccessor.set(__entity, __currentStates);%n" );
618688 }
0 commit comments