No estaba demasiado emocionado con ninguna de las sugerencias hechas anteriormente, así que creé un aspecto que manejaría esto para mí.
Esto no se ha probado completamente, y definitivamente no se ha probado en las colecciones de objetos incrustados, por lo que debe tener cuidado con el comprador. Sin embargo, parece funcionar para mí hasta ahora.
Básicamente, intercepta el captador al campo @Embedded
y se asegura de que el campo esté ocupado.
public aspect NonNullEmbedded {
// define a pointcut for any getter method of a field with @Embedded of type Validity with any name in com.ia.domain package
pointcut embeddedGetter() : get(@javax.persistence.Embedded * com.company.model..*);
/**
* Advice to run before any Embedded getter.
* Checks if the field is null. If it is, then it automatically instantiates the Embedded object.
*/
Object around() : embeddedGetter(){
Object value = proceed();
// check if null. If so, then instantiate the object and assign it to the model.
// Otherwise just return the value retrieved.
if(value == null){
String fieldName = thisJoinPoint.getSignature().getName();
Object obj = thisJoinPoint.getThis();
// check to see if the obj has the field already defined or is null
try{
Field field = obj.getClass().getDeclaredField(fieldName);
Class clazz = field.getType();
value = clazz.newInstance();
field.setAccessible(true);
field.set(obj, value);
}
catch(NoSuchFieldException | IllegalAccessException | InstantiationException e){
e.printStackTrace();
}
}
return value;
}
}
¿Quieres decir un elemento compuesto? – Zoidberg
Sí. ¿Por qué no puedo responder con menos de 15 caracteres? –
No estoy seguro de cómo hacerlo con las anotaciones, pero puedo mostrarle el xml – Zoidberg