@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;
...
}
_이 설정은 기존 activePolicyRules가 자신의 category_policy_id가에 널 (null)로 설정 한 업데이트됩니다고아는 일대 다 관계 (JPA/최대 절전 모드)
@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;
...
}
에 심지어 orphanRemoval와 데이터베이스 = 충실 데이터베이스와 새로운 데이터베이스가 삽입됩니다. 나는 원래의 것들을 삭제하고 싶습니다.
나는 orphanRemoval = true를 추가하는 것이 좋다고 생각했으나 그렇지 않았습니다. 필자가 보았던 다른 질문으로는 양방향 관계가 있고 부모를 null로 설정하면 문제가 해결되지만 양방향 관계가 아닙니다.
제안 사항? 기존 AbstractPolicyRule이 데이터베이스에 존재하는 경우 에만 발생, 나는 목록에서 제거 후 다시 분류를 저장합니다
편집 최대 절전 모드 3.5.3을 사용하여
. 외래 키인 category_policy_id가 삭제되는 대신 null로 설정됩니다.
@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;
...
}
이 같은 문제를 가지고 : 최대 절전 모드 문서는 이전 방법을 낙담하기 때문에
[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
또한 조인 테이블을 시도했다. 매핑 테이블의 행은 삭제되지만 AbstractPolicyRule에는 제거 된 항목이 계속 포함됩니다.
테스트 한 시나리오는 실제로 편집과 매우 비슷했습니다. 나는 다른 것을 추가하지 않고 컬렉션에서 기존 요소를 제거하기 위해 테스트를 변경했으며 여전히 삭제됩니다. 내가 상속을 사용하지는 않는다는 것에 유의하십시오 (나는 당신이있을 것이라고 생각합니다). –