@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "company_policies")
@DiscriminatorColumn(name = "rule_name")
public abstract class AbstractPolicyRule implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String value;
...
}
@Entity
public class Category implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(name = "category_name")
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "category_policy_id", referencedColumnName = "id")
private Set<AbstractPolicyRule> activePolicyRules;
...
}
Kiedy ten zestaw jest aktualizowana istniejące activePolicyRules mają swoje category_policy_id wartość null w baza danych i nowe są wstawione. Chciałbym, aby oryginalne zostały usunięte.
Myślałem dodanie orphanRemoval = true to zrobić, ale tak nie jest. Inne pytania, które widziałem na ten temat, wydają się mieć dwukierunkowe relacje i ustawienie rodzica na wartość null rozwiązuje to, ale nie jest to dwukierunkowa relacja.
Wszelkie sugestie?
Korzystanie Hibernate 3.5.3
Edit: Dzieje się tak tylko wtedy, gdy istnieje istniejąca AbstractPolicyRule w bazie danych, usunąć go z listy, a następnie ponownie zapisać kategorię. Jego klucz obcy, category_policy_id, ma wartość null, a nie jest usuwany.
[DEBUG] Collection found: [domain.category.Category.activePolicyRules#1], was:
[<unreferenced>] (initialized)
[DEBUG] Flushed: 0 insertions, 2 updates, 0 deletions to 2 objects
[DEBUG] Flushed: 1 (re)creations, 0 updates, 1 removals to 1 collections
...
[DEBUG] Deleting collection: [domain.category.Category2.activePolicyRules#1]
[DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[DEBUG] update company_policies set category_policy_id=null where category_policy_id=?
[DEBUG] done deleting collection
próbował również stół dołączyć ponieważ dokumentacja Hibernate zniechęca poprzedni sposób:
@Entity
public class Category implements Serializable {
@Transient
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(name = "category_name")
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(name = "policy_rule_mapping",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "rule_id"))
private Set<AbstractPolicyRule> activePolicyRules;
...
}
to ma ten sam problem. Wiersz tabeli odwzorowań zostanie usunięty, ale AbstractPolicyRule nadal zawiera usunięty element.
Scenariusz, który testowałem, był bardzo bliski Twojej edycji. Zmieniłem mój test, aby usunąć istniejący element z kolekcji bez dodawania kolejnego i nadal jest usuwany. Zauważ, że nie używam żadnego dziedziczenia (myślę, że możesz być). –