Ho un'applicazione che utilizza Hibernate per la persistenza dei dati, con Spring in cima (per una buona misura). Fino a poco tempo fa, c'era una classe persistente nell'applicazione, A:È una cattiva pratica usare DiscriminatorFormula per la migrazione dei database di Hibernate?
@Entity
public class A {
@Id
@Column(unique = true, nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
public String name;
}
allora ho aggiunto una sottoclasse di A, chiamato B:
@Entity
public class B extends A {
public String description;
}
Dopo aver aggiunto B, ora potevo non caricare una di . La seguente eccezione è stato gettato:
class org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException :: Object with id: 1 was not of the specified subclass: A (Discriminator: null); nested exception is org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: A (Discriminator: null)
ho aggiunto la seguente annotazione e la proprietà a B, e sembra aver risolto il problema. È questo il modo giusto per risolvere il problema?
...
@DiscriminatorFormula("(CASE WHEN dtype IS NULL THEN 'A' ELSE dtype END)")
public class A {
private String dtype = this.getClass().getSimpleName();
...
grazie per la risposta dettagliata. Sfortunatamente non avrò accesso diretto a tutte le installazioni dell'applicazione, quindi mi piacerebbe che lo schema cambiasse in modo trasparente per gli utenti. Ho provato ad aggiungere il DiscriminatorFormula senza definire esplicitamente il campo dtype, ma questo non ha funzionato. Mi è sembrato un trucco quando lo stavo facendo - è per questo che ho chiesto. – Armand
@ Alison, prego. Ti ho dato ciò che è IMO la soluzione "ideale". Se non è adatto nel tuo contesto, se non puoi fornire uno script di migrazione ai tuoi utenti (che eseguirà 'UPDATE' dopo i vari' ALTER') - o ancora meglio uno strumento di migrazione automatica - allora la tua soluzione è accettabile. Almeno funziona. E ora sai che è un po 'un trucco :) –
-) Ho trovato informazioni sulle migrazioni a Hibernate/Spring piuttosto difficili da trovare, sfortunatamente. – Armand