@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;
...
}
Lorsque cet ensemble est mis à jour les activePolicyRules existants ont leur category_policy_id à null dans la base de données et les nouveaux sont insérés. J'aimerais que les originaux soient supprimés.
Je pensais que l'ajout de la fonction orphelins = true le ferait mais ce n'est pas le cas. D'autres questions que j'ai vues à ce sujet semblent avoir des relations bidirectionnelles et le fait de mettre le parent à zéro le résout, mais ce n'est pas une relation bidirectionnelle.
Des suggestions?
En utilisant Hibernate 3.5.3
Edit: Cela se produit uniquement lorsqu'un AbstractPolicyRule existant existe dans la base de données, je le supprimer de la liste et puis enregistrez la catégorie à nouveau. C'est la clé étrangère, category_policy_id, est défini sur null au lieu d'être supprimé.
[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
a également essayé une table de jointure depuis la documentation Hibernate décourage la façon précédente:
@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;
...
}
Cela a le même problème. La ligne de la table de mappage est supprimée, mais AbstractPolicyRule contient toujours l'élément supprimé.
Le scénario que j'ai testé était en fait très proche de votre édition. J'ai changé mon test pour supprimer l'élément existant de la collection sans en ajouter un autre et il est toujours supprimé. Notez que je n'utilise aucun héritage (je pense que vous pourriez l'être). –