Domanda

Quello che voglio:

@Embedded(nullable = false)
private Direito direito;

Tuttavia, come sapete non c'è nessuna tale attributo per @Embeddable.

C'è un modo corretto di fare questo? Non voglio soluzioni alternative.

È stato utile?

Soluzione

Componenti Embeddabili (o elementi compositi, quello che volete chiamarli) di solito contengono più di una proprietà e quindi sono mappati più di una colonna. L'intero componente essendo nulla può essere trattata in modo diverso; J2EE spec non dettare un modo o nell'altro.

Sospensione ritiene componente da NULL se tutte le sue proprietà sono NULL (e viceversa). È quindi possibile dichiarare una (qualsiasi) delle proprietà di essere non nullo (sia all'interno @Embeddable o come parte di @AttributeOverride su @Embedded) per ottenere ciò che si desidera.

In alternativa, se si sta usando Hibernate Validator è possibile annotare la vostra proprietà con @NotNull anche se questo comporterà solo sotto controllo a livello di applicazione, non db-livello.

Altri suggerimenti

E 'possibile usare "hibernate.create_empty_composites.enabled" poiché Hibernate 5.1 per modificare questo comportamento (vedi https://hibernate.atlassian.net/browse/HHH-7610 )

Aggiungi campo fittizio in classe che è contrassegnata @Embeddable.

@Formula("0")
private int dummy;

https://issues.jboss.org/browse/HIBERNATE-50 .

Non ero troppo entusiasta con una delle proposte fatte in precedenza, così ho creato un aspetto che avrebbe gestito questo per me.

Questo non è completamente testato, e sicuramente non testato contro Collezioni di oggetti incorporati, in modo da acquirente-attenzione. Tuttavia, sembra funzionare per me finora.

Fondamentalmente, intercetta il getter al campo @Embedded e assicura che il campo viene compilato.

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

È possibile utilizzare un getter nullsafe.

public Direito getDireito() {
    if (direito == null) {
        direito = new Direito();
    }
    return direito;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top