2009-07-03 5 views
2

나는이 수업을 가지고 있습니다.일대일 관계 삭제

@Entity 
@Table(name ="a") 
class A{ 
    private Integer aId; 
    private B b; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id_a") 
    public Integer getAId() { 
return aId; 
    } 

    @OneToOne(mappedBy = "a", cascade={CascadeType.ALL}) 
    public B getB() { 
     return b; 
    } 
} 

@Entity 
@Table (name= "b") 
class B{ 
    private A a; 

    @OneToOne 
    @JoinColumn(name = "id_a") 
    public A getA() { 
     return a; 
    } 

} 

그리고 표는 다음과 같다 :

A) | id_A | .... 다른 필드 ... |

B) | id_B | fk_id_A | .. 다른 필드 .. |

하지만,이 인스턴스를 삭제하려고하면, 내가 얻을

org.hibernate.ObjectDeletedException : 가 (삭제 된 개체를 제거합니다 삭제 된 개체는 계단식으로 다시 저장됩니다

b.setA(null) 
a.setB(null) 
: [B 번호 130]) 조합에서

제가 상호 참조에 널 설정 시도한

그러나 예외는 여전히 발생합니다.

내가 성취 한 모든 것은 A의 행을 삭제하고 B의 외래 키를 null로 남겨두고 B를 삭제하려고하면 같은 오류가 발생합니다.

이 내 삭제 코드 :

public static void delete(Object object) throws Exception { 
     Transaction tx = getSession().beginTransaction();  
     try { 
      getSession().delete(object); 
      tx.commit(); 
     } catch (Exception ex) { 
      tx.rollback(); 
      getSession().close(); 
      throw ex; 
     } 
    } 

getSession

항상 유효한 세션을 반환합니다.

내가 빠진 것이 있습니까?

답변

1

위에서 시작하여 계속 작업하십시오. 표 B에서 A에 대한 참조를 삭제해야합니다. 따라서 A에서 삭제하려는 레코드의 B에서 참조를 찾고 B에서 해당 레코드를 삭제하십시오. 그런 다음 A로 돌아가 A에서 레코드를 삭제하십시오.

SQL Server를 사용하는 경우 테이블 A에 계단식 삭제를 설정할 수 있으며 자동으로 수행됩니다. 당신은 이것에 조심해야한다. 나는 복잡한 구조에 이것을 추천하지 않는다.

0

다른 트랜잭션에서 상호 참조의 nulling을 수행하고 있습니까? 이러한 변경 사항은 삭제 작업을 위해 커밋해야 할 수 있습니다.