2010-06-14 5 views
0

부모 테이블 A와 자식 테이블 B, C가 다 관계를 가지고 있습니다.Hibernate를 사용하여 부모 테이블을 갱신하는 동안 자식 테이블 레코드를 삭제하는 방법

부모 테이블의 기본 키 1 AI가 자식 테이블 B의 3 행과 자식 테이블에 4 행 C. 지금은 자식 테이블의 행을 삭제하려면

을 가지고처럼 데이터가 있다고 가정하자 부모 테이블 업데이트 중 (즉, 지금은 각 하위 테이블의 한 행만 사용하여 테이블을 업데이트하고 그 중 다른 행을 삭제하려는 경우) 최대 절전 모드에서이 시나리오를 처리하는 방법은 무엇입니까?

업데이트 첫째

, 내 질문이 불분명 미안. 자세한 내용은 다음과 같습니다.

내가

CREATE TABLE "DEV2"."POLICY" ("POLICY_OID" NUMBER(38,0) NOT NULL ENABLE, "CREATED_DATE" TIMESTAMP (0) NOT NULL ENABLE, "EFFECTIVE_DATE" TIMESTAMP (0), "UPDATED_DATE" TIMESTAMP (0), "STATUS" VARCHAR2(32 BYTE), CONSTRAINT "PK128" PRIMARY KEY ("POLICY_OID") , CONSTRAINT "REFPOLICY_CLASS290" FOREIGN KEY ("POLICY_CLASS") REFERENCES "DEV2"."POLICY_CLASS" ("POLICY_CLASS_REF") ENABLE) 

과 @OneToMany 관계를 예를 들어 자식 테이블 POLICY_RELATIONSHIP

CREATE TABLE "DEV2"."POLICY_RELATIONSHIP" ("POLICY_RELATIONSHIP_OID" NUMBER(38,0) NOT NULL ENABLE, "POLICY_ACTOR" NUMBER(38,0) NOT NULL ENABLE, "POLICY_ACTOR_TYPE" VARCHAR2(32 BYTE) NOT NULL ENABLE, "POLICY_OID" NUMBER(38,0) NOT NULL ENABLE, CONSTRAINT "PK156" PRIMARY KEY ("POLICY_RELATIONSHIP_OID") , CONSTRAINT "REFPOLICY338" FOREIGN KEY ("POLICY_OID") REFERENCES "DEV2"."POLICY" ("POLICY_OID") ENABLE) 

에 부모 테이블의 정책을 가지고,이 같은 샘플 데이터 뭔가가있다.

POLICY_OID CREATED_DATE EFFECTIVE_DATE STATUS UPDATED_DATE 
1234 06/14/2020 06/14/2010 active 06/14/2010 

POLICY_RELATIONSHIP_OID POLICY_ACTOR POLICY_ACTOR_TYPE POLICY_OID 
98765 John Primary User 1234 

98766 Bill Secondary User 1234 

98767 Mary Intermediate User 1234 

나는 1234 UPDATED_DATE이 2010년 6월 15일에 변경된 정책 개체를 유지하려고하고 PolicyRelationship이

POLICY_RELATIONSHIP_OID POLICY_ACTOR POLICY_ACTOR_TYPE POLICY_OID 

null George Primary User 1234 

가 최대 절전 모드로 가능한 모든 방법이 아래에 같은 데이터가있는 경우 삭제 PolicyRelation 테이블에 이미 존재하는 3 개의 행과 새로운 데이터를 가지는 새로운 행을 삽입합니다.

내 문제가 아직 불분명 한 경우 알려 주시기 바랍니다.

내 환경 :

자바 1.6, 보스 3.5 최대 절전 모드.

답변

0

사물의 _N_Hibernate 측면에서이 적용되지 않을 수 있지만 캐스케이드 옵션을 설정할 수 없습니다 (NHibernate에서는 cascade = "all, delete-orphan")? 그런 다음 부모를 저장하기 전에 각 하위의 부모를 null로 설정해야합니다.

1

자바 코드에서이 작업을 수행하고 매핑이 올바른 경우 모든 사항이 정상입니다.

policy.getPolicyRelationships().clear(); 
PolicyRelationship pr = new PolicyRelationship(); 
... 
pr.setParent(policy); 
policy.getPolicyRelationships().add(pr); 
dao.save(policy); 

또는 당신이 원하는 값으로 아이들의 기존 설정을 덮어 쓰기 : 당신이 폭포의 일종을 사용하는 경우 '모든'코드는 다음과 같이 될 것이다 '업데이트를 저장', 또는.

policy.getPolicyRelationships().clear(); 
Set<PolicyRelationship> prSet = new TreeSet<PolicyRelationship>(); 
PolicyRelationship pr = new PolicyRelationship(); 
prSet.add(pr); 
... 
pr.setParent(policy); 
policy.setPolicyRelationships(prSet); 
dao.save(policy); 

는 다른 방법으로는 캐스케이드를 사용하도록 관계를 설정할 수 = "모든-고아 삭제"그들이 지배 기업에 대한 자신의 참조를 잃게되면 최대 절전 모드가 그 아이를 제거해야합니다 의미합니다. 정책을 삭제하는 경우 관련이 있으며 정책 관계가 DB에서도 삭제됩니다.

+0

두 번째 방법을 사용하는 경우 PolicyRelationship의 외래 키가 NULL이 아니므로 DataIntegrityViolation 예외가 발생합니다. 그렇지 않니? – user529823

+0

네가 맞다.더 생각해 보면, 두 번째 예제는 불분명했습니다. – zmf

+0

불분명 한 점을 말해 줄 수 있습니까? 그러면 내가 제공해야하는 정보가 더 무엇인지 알게 될 것입니다. – user529823

관련 문제