@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 равным null в базе данных, а новые - вставляются. Я бы хотел, чтобы исходные были удалены.
Я думал, что добавление orphanRemoval = true сделает это, но это не так. Другие вопросы, которые я видел на этом, по-видимому, имеют двунаправленные отношения и задание родительского элемента в null разрешают его, но это не двунаправленное отношение.
Любые предложения?
Использование Hibernate 3.5.3
Изменить: Это происходит только в том случае, если существующий AbstractPolicyRule существует в базе данных, я удаляю его из списка и снова сохраняю Категория. Его внешний ключ, category_policy_id, имеет значение null вместо удаления.
[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
Также попробовали таблицу соединений, так как документация Hibernate обескураживает предыдущий способ:
@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;
...
}
У этой проблемы. Строка в таблице сопоставления удаляется, но AbstractPolicyRule по-прежнему содержит удаленный элемент.