hibernate nullable embeddable

¿Puedo hacer que una entidad Hibernate incrustada no se pueda nulos?



nullable embeddable (5)

Lo que quiero:

@Embedded(nullable = false) private Direito direito;

Sin embargo, como sabes, no hay tal atributo en @Embeddable.

¿Hay una forma correcta de hacer esto? No quiero soluciones.




Los componentes que se pueden insertar (o los elementos compuestos, como quiera que los llame) generalmente contienen más de una propiedad y, por lo tanto, se asignan a más de una columna. Todo el componente que es nulo, por lo tanto, se puede tratar de diferentes maneras; La especificación J2EE no dicta una forma u otra.

Hibernate considera que el componente es NULL si todas sus propiedades son NULL (y viceversa). Por lo tanto, puede declarar que una (cualquiera) de las propiedades no es nula (ya sea dentro de @Embeddable o como parte de @AttributeOverride en @Embedded ) para lograr lo que desea.

Alternativamente, si está utilizando Hibernate Validator puede anotar su propiedad con @NotNull aunque esto solo dará como resultado una verificación a nivel de la aplicación, no un nivel db.


No estaba demasiado emocionado con ninguna de las sugerencias que hice 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, así que ten cuidado. Sin embargo, parece funcionar para mí hasta ahora.

Básicamente, intercepta el getter al campo @Embedded y se asegura de que el campo esté @Embedded .

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; } }


Puedes usar un getter nullsafe.

public Direito getDireito() { if (direito == null) { direito = new Direito(); } return direito; }