Sto riscontrando che i record orfani non vengono eliminati quando si rimuove da una raccolta in Sospensione. Io devo fare qualcosa di semplice sbagliato, (questo è Hibernate-101!), Ma non riesco a trovarlo ..Sospensione dell'eliminazione degli orfani durante l'aggiornamento della raccolta
Dato il seguente:
public class Book {
@ManyToOne
@NotNull
Author author;
}
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
List<Book> books;
}
E il codice seguente aggiornamento:
Author author = authorDAO.get(1);
Book book = author.getBooks().get(0);
author.getBooks().remove(0);
authorDAO.update(author);
AuthorDAO snippet:
@Override
public void update(T entity) {
getSession().update(entity);
}
Di seguito la prova non riesce:
0.123.Author author = author.get(1);
assertEquals(0,author.getBooks().size()); // Passes
Book dbBook = bookDAO.get(book.getId())
assertNull(dbBook); // Fail! dbBook still exists!
assertFalse(author.getBooks().contains(dbBook) // Passes!
In sintesi, mi sto trovando:
- Mentre libro viene rimosso dalla collezione dell'autore di libri, esiste ancora nel database
- Se esamino
book.getAuthor().getBooks()
, il libro non esiste in quella raccolta
Questo "sembra" come se non stessi svuotando la sessione o forzando un aggiornamento in modo appropriato - ma non sono sicuro di dove dovrei farlo. Lungo tale vena, altri punti che possono essere influire:
- sto eseguendo quanto sopra in un test JUnit decorato con
@RunWith(SpringJUnit4ClassRunner.class)
- Originariamente ho colpito questo problema all'interno di una routine di aggiornamento che è decorato con
@Transactional
, tuttavia, Da allora l'ho ricreato in un semplice vecchio test di JUnit.
Qualsiasi consiglio sarebbe molto apprezzato!
MODIFICA: Grazie per tutto il feedback già. A seguito di commenti qui sotto, ho aggiunto il @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
al genitore, quindi è ora:
public class Author
{
@OneToMany(cascade={CascadeType.ALL})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
List<Book> books;
}
sto ancora trovando gli stessi risultati. DEVO mancare qualcosa di semplice.
Ho aggiunto questa annotazione, ma non funziona ancora - gli stessi risultati di prima. –
Stai anche impostando il riferimento dell'autore nel libro su null? – cletus
No, pensavo che fosse il punto dell'annotazione DELETE_OPRHAN? –