Ciao Ho un semplice DAO con la funzione di seguito.JPA EntityManager persist() che fa apparire l'oggetto distaccato anche se è stato generato un errore
public element createElement(Element e){
em.persist(e);
em.flush();
return e;
}
La tabella entità ha un vincolo univoco sulla coppia (tipo, il valore) e ho un test di seguito:
public void testCreateElement() throws DataAccessException {
// Start with empty Element table
Element e = new Element();
e.setType(myType.OTHER);
e.setValue("1");
dao.createElement(e);
e = new Element();
e.setType(MyType.OTHER);
e.setValue("1");
try{
// this should violate unique constraint of database.
dao.createElement(e);
} catch (Exception ex) {
System.out.println(ex);
}
e.setValue("2");
try{
// I expect this to work as there is no element with these values.
dao.createElement(e);
} catch (Exception ex) {
System.out.println(ex);
}
}
Il mio primo errore catturato accade come mi aspetto da quando so che ho' m violando il vincolo, la seconda try/catch non dovrebbe genera un errore per quanto mi riguarda, ma lo fa, che cosa ottengo il suo presente:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mypackage.Element
così sembra chiamare persistono() su " e "anche se non è stato persistito ha ha causato l'ibernazione di pensare che sia un'entità distaccata.
Questo è fastidioso perché queste funzioni vengono utilizzate da un front-end JSF che si occupa dell'eccezione ConstraintViolation, ma che si aggrappano deliberatamente all'oggetto in modo che l'utente possa modificare uno dei campi e riprovare, e ottengono l'errore dell'entità distaccata.
Questo comportamento è un errore di ibernazione perché non penso che dovrebbe farlo davvero? C'è un modo per aggirare questo a livello di DAO in modo tale che persista vinto; t trattare il mio oggetto come distaccato se non è effettivamente persistente?
saluti,
Glen x
Solo per i sorrisi, cosa succede se si crea un nuovo elemento e si impostano i valori corretti prima dell'ultimo createElement che si sta chiamando? –
Va bene. – Link19
Questo aiuto? In caso contrario, potrebbe funzionare ... e.setValue (1); e = dao.createElement (e); (<- fallirà) ma poi e.setValue (2); edao.createElement (e); (<- funzionerà, si spera). –