2014-07-26 12 views
16

Sto tentando di utilizzare java.util.Optional in alcune classi persistenti. C'è qualche soluzione per farlo funzionare? Ho provato a utilizzare UserType, ma non è possibile gestire qualcosa come Opzionale senza mapparlo manualmente a mano (non accettabile) Ho anche provato a utilizzare il convertitore JPA, ma non supporta i tipi parametrizzati. ho potuto utilizzare il confezionamento getter e setter come, ma è più simile a un hack che una soluzioneHibernate ORM - supporto Java 1.8 Opzionale per le proprietà dell'entità

public class MyClass { 
    private MyOtherClass other; 

    public Optional<MyOtherClass> getOther() { 
     return Optional.ofNullable(other); 
    } 

    public voud setOther(Optional<MyOtherClass> other) { 
     this.other = other.orElse(null); 
    } 
} 

Grazie!

risposta

26

Come spiegato nel this blog post, non è possibile utilizzare la java.util.Optional come attributo un'entità persistente dal Optional non è Serializable.

Tuttavia, supponendo che si stia utilizzando field-based access, è possibile utilizzare il contenitore Optional nei metodi getter/setter.

Hibernate può quindi prendere il tipo effettivo dall'attributo entità, mentre il getter e setter possono utilizzare Optional:

private String name; 

public Optional<String> getName() { 
    return Optional.ofNullable(name); 
} 
+0

Ho visto questo e devo proprio dire che mai e poi mai dovrebbe usare Extra in attributi solo come valore di ritorno dei metodi. – dom

+3

ho visto questo e devo proprio dire che puoi usare facoltativo ogni volta che vuoi evitare "null" nella tua base di codice finché ti senti a tuo agio con esso e anche se tutti continuano a ripetere l'architetto del linguaggio che non vuole avere " monadic-ish "composizione di" optionalità "nella libreria principale a favore di insistere sull'uso di Hoars per un errore di 1 miliardo di dollari. Assicurati solo di salvaguardare le librerie/le apis esterne "che vengono in giro con oggetti nulli e starai bene. – dwegener

Problemi correlati