Can I make an embedded Hibernate entity non-nullable?

后端 未结 5 1651
日久生厌
日久生厌 2020-12-05 06:53

What I want:

@Embedded(nullable = false)
private Direito direito;

However, as you know there\'s no such attribute to @Embeddable.

I

5条回答
  •  天命终不由人
    2020-12-05 07:30

    I wasn't too thrilled with either of the suggestions previously made, so I created an aspect that would handle this for me.

    This isn't fully tested, and definitely not tested against Collections of embedded objects, so buyer-beware. However, seems to work for me so far.

    Basically, intercepts the getter to the @Embedded field and ensures that the field is populated.

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

提交回复
热议问题