Implementazione attributo insieme di enum

Ciao a tutti,

piccola domanda JPA/CUBA: qual è il metodo migliore secondo voi per creare un’entità contenente un attributo di tipo Set<Enum>?
Mi spiego con un esempio:
ENTITY: Automobile
ENUM: TipoAutomobileEnum (valori: Diesel, Benzina, Elettrica, Ibrida, 4WD, 2WD, IdoneaNeoPatentati, …):
Come posso dire in JPA/Cuba che Automobile ha un Set di TipoAutomobileEnum?

La mia soluzione è stata:

  • Creazione di un’entità che contiene l’enum come attributo, in relazione molti-a-uno con Automobile
  • Presentazione/regole sullo screen di edit per trattare la lista (implementazione della relazione tra le 2 entità) alla stregua di un Set (no duplicati)

Grazie e ciao,

Andrea

Ciao Andrea!

Il problema è che le Enum non sono entità, sono solo un tipo di dato (esteso da CUBA) per rendere più agevole l’utilizzzo di attributi scalari (interi e stringhe). L’ORM traduce sempre in un tipo scalare su DB, quindi avrai una colonna intera o una stringa.

In generale non è possibile creare Set, List o Array di attributi scalari, semplicemente perché la maggior parte dei RDBMS non supporta queste strutture nativamente. Dico in generale perché ci sono delle eccezioni famose, come PostgreSQL, in cui una tabella può avere come colonna un array di interi, stringhe ecc. Un framework democratico come CUBA non potrà mai supportare qualcosa che esiste solo in PostgreSQL, e che dovrebbe utilizzare delle estensioni specifiche di EclipseLink ad esempio.

Si questa è la soluzione, modellare una relazione esterna.
Personalmente eviterei di fare una entità che ha sia una chiave primaria, sia l’enum come attributo, perché sarebbe ridondante.
Se crei un’entità con chiave stringa o int (a tua discrezione), puoi riservare dei codici di “sistema” che poi mappi ad una enum da codice (plain Java). Ad esempio DIES per diesel, ELET per elettrica ecc. e poi ti fai una enum in global che usi nel codice. E’ quello che ho sempre fatto su DB quando non usavo ORM.

Come spunto aggiuntivo, se necessiti di un set predefinito di record, puoi pre-caricarli al primo deploy e proteggerli aggiungendo ad esempio un attributo “sistema” (boolean) che se impostato rende impossibile all’utente modificare/rimuovere tali record.

Ciao!
Paolo

1 Mi Piace

Grazie Paolo! Chiarissimo

1 Mi Piace