Domanda fondamentale: perché gli oggetti @Embedded non vengono sempre istanziati?@ L'oggetto incorporato non viene istanziato automaticamente se non contiene campi di dati di base
L'osservazione interessante è che Ebean non istanzia gli oggetti @Embedded se questi non contengono tipi di dati di base (int, booleano ...) o non sono stati toccati prima. Esempio:
@Entity
public class Embedder {
// getNotAutoInstantiated() will return null if this field was not touched before
@Embedded
private NotAutoInstantiated notAutoInstantiated = new NotAutoInstantiated();
// getAutoInstantiated() will always return an instance!
@Embedded
private AutoInstantiated autoInstantiated = new AutoInstantiated();
}
@Embeddable
public class AutoInstantiated {
// theKey is why this embedded object is always instantiated
private int theKey;
private String field1;
}
@Embeddable
public class NotAutoInstantiated {
private String field2;
}
Potrebbe essersi verificato un problema con collisioni di nomi di campi tra più oggetti incorporati. Normalmente, il provider JPA associa i campi degli oggetti incorporati alle colonne nella tabella padre. Se i nomi dei campi incorporati vengono eseguiti a lungo, si può finire con nomi di campi troncati nel database e quindi collisioni nei nomi delle colonne. – Zagrev
L'esempio potrebbe essere ingannevole. I nomi sono molto più brevi nel mio codice e non iniziano con lo stesso prefisso. Ma anche nell'esempio i campi iniziano con "not" e "auto", quindi il troncamento non sarebbe un grosso problema. – allprog
In realtà, stavo pensando a "campo" e "campo". – Zagrev