@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;
...
}
जब यह सेट अद्यतन किया जाता है मौजूदा activePolicyRules उनके category_policy_id में शून्य पर निर्धारित किया है पर = सच भी orphanRemoval साथ डेटाबेस में रहने डेटाबेस और नए डाले गए हैं। मैं मूल लोगों को हटाना चाहता हूं।
मैं orphanRemoval = सच कहा कि क्या करना होगा सोचा लेकिन यह नहीं है। इस पर मैंने जिन अन्य प्रश्नों को देखा है, वे द्वि-दिशात्मक रिश्ते हैं और माता-पिता को शून्य हल करने के लिए सेट करते हैं, लेकिन यह द्वि-दिशात्मक संबंध नहीं है।
कोई सुझाव?
हाइबरनेट 3.5.3 का उपयोग
संपादित करें: यह केवल तब होता एक मौजूदा AbstractPolicyRule डेटाबेस में मौजूद है जब, मैं इसे सूची से हटाने और फिर श्रेणी फिर से सहेजें। यह विदेशी कुंजी है, category_policy_id, हटाए जाने की बजाय शून्य पर सेट है।
[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
इसके अलावा एक मेज में शामिल होने की कोशिश की क्योंकि हाइबरनेट प्रलेखन पिछले रास्ता हतोत्साहित:
@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;
...
}
यह वही समस्या है। मानचित्रण तालिका में पंक्ति हटा दी गई है लेकिन सार नीति नीति में अभी भी हटाई गई वस्तु है।
मैंने जो परिदृश्य परीक्षण किया वह वास्तव में आपके संपादन के बहुत करीब था। मैंने संग्रह से मौजूदा तत्व को किसी अन्य को जोड़ने के बिना अपना परीक्षण बदल दिया और यह अभी भी हटा दिया गया है। ध्यान दें कि मैं किसी विरासत का उपयोग नहीं कर रहा हूं (मुझे लगता है कि आप हो सकते हैं)। –