Nella mia applicazione, un'operazione di ibernazione va in questo modo. L'applicazione aggiorna un'entità padre con nuovi valori dalla richiesta ed elimina tutte le entità figlio esistenti (precedentemente inserite) e inserisce nuovi record figli.Una raccolta con cascade = "all-delete-orphan" non è più referenziata dall'istanza dell'entità proprietaria
Sto utilizzando lo stato di sospensione DELETE_ORPHAN
per questo, come puoi vedere di seguito.
quando faccio questo, sto diventando l'eccezione di seguito:
org.hibernate.HibernateException: Una collezione con cascade = "all-delete-orphan" non era più a cui fa riferimento il possesso entità istanza: com.childs
Ho visto thread simili con il problema, e ho cercato di appy soluzioni in quei thread. Ma che non ha funzionato
mio soggetto controllante
public class Parent implements Serializable {
@Column(name = "PARENT_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "seq")
private Integer parentId; //primary key of parent
.......
........
//mapping to child entity
@OneToMany(mappedBy = "parent", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Child> childs;
................
...............
}
entità Bambino ha una chiave combinata e ha un'entità PK ha mostrato di seguito Codice
public class ChildPK implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -447592368963477750L;
/** . */
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;
/**. */
@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GenericGenerator(name="child_seq", strategy="com.DB2Dialect")
@GeneratedValue(generator="child_seq")
private Integer childId;
}
child entity goes like this:
public class Child implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 185670997643552301L;
/** The pol cntct id. */
@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
private Integer childId;
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;
}
Java
...................
..............
parent.getChild().clear();
Child child = new Child();
parent.setChild(child);
Cosa potrebbe essere sbagliato qui.
Grazie in anticipo ...
Per @JBNizet ho un problema simile e ho applicato la soluzione. In realtà, dalle 2 soluzioni che hai indicato ho usato la versione successiva (nel metodo setter ho eliminato la collezione bambini - this.children.clear() - e ho aggiunto i nuovi bambini - this.children.addAll (bambini)). Questo cambiamento non ha risolto il mio problema. Ricevo ancora il messaggio "Una raccolta con cascade =" all-delete-orphan "non è più referenziata dall'eccezione" istanza dell'entità proprietaria ". Hai un'idea del perché? Grazie mille! – ovdsrn
No, non ne ho idea. Puoi fare una domanda, mostrando il tuo codice, la traccia completa dello stack, ecc. –
Forse in 'setChildren' deve essere aggiunto il controllo nullo' if (children! = Null) {this.children.addAll (bambini);} – lolotron