2014-04-25 4 views
0

Hibernate을 사용하는 응용 프로그램에서 데이터베이스의 일부 레코드를 삭제하려고합니다. 관련 엔티티는 다음과 같습니다최대 절전 모드 OneToMany 연결에서 레코드 삭제

@Entity 
public class Product { 

    private String serialNumber; 
    private Set<Part> parts = new HashSet<Part>(); 

    @Id 
    public String getSerialNumber() { return serialNumber; } 
    void setSerialNumber(String sn) { serialNumber = sn; } 

    @OneToMany 
    public Set<Part> getParts() { return parts; } 
    void setParts(Set parts) { this.parts = parts; } 

    ... 
} 


@Entity 
public class Part implements Serializable { 

    @Id 
    @GeneratedValue 
    private Long part_id; 

    private String userCode = ""; 

     //getters and setters 
     .... 


} 

내가 할 수있는 이클립스 part_iduserCode에 따라 Entity Part에 등호와 hashCode를 구현합니다. 또한 Entity Factory에서 다른 엔티티와의 모든 연결을 '시작'합니다. 따라서 모든 변경 사항을 저장하려면 명령을 실행하기 만하면됩니다.

session.update(factory); 

모든 변경 사항은 부품에서 삭제 된 경우를 제외하고 성공적으로 저장됩니다. 내가 수행 밖으로 comig

products.getParts.remove(part); 

이슈는 다음과 같습니다

어떤 경우에는

1)이 Setequalstrue 반환에 part에 비교합니다 (part가에 있지만 제거하지 Set에서 part입니다 Set은 같음에 따라 제거되지만 지워지지 않음)

2) 이 Set에 성공하더라도 데이터베이스의 레코드는 삭제되지 않습니다.

쿼리를 사용하지 않고이 경우 레코드를 제거하는 가장 좋은 방법은 무엇입니까?

답변

1

당신은 자식을 명시 적으로 제거해야합니다

session.delete(part); 

Hibernate Docs에서 :

다음 코드 :

Parent p = (Parent) session.load(Parent.class, pid); 
Child c = (Child) p.getChildren().iterator().next(); 
p.getChildren().remove(c); 
c.setParent(null); 
session.flush(); 

이는 데이터베이스로부터 c를 제거하지 않을 것이다. 이 경우에는 만 p에 대한 링크를 제거하고 NOT NULL 제약 조건 위반을 발생시킵니다. 자식을 명시 적으로 삭제()해야합니다 ( ).

Parent p = (Parent) session.load(Parent.class, pid); 
Child c = (Child) p.getChildren().iterator().next(); 
p.getChildren().remove(c); 
session.delete(c); 
session.flush(); 
+0

Hibernate Docs에서 제안 된대로 시도했지만 예외가 발생합니다. 부모 행을 삭제하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다. Part 클래스에서 Produkt라는 속성이 없다는 사실을 알아야한다. 그게 필수입니까? – arjacsoh

+0

예, 필수적입니다. 그것은 외래 키가 지정된 곳입니다. 'Part' 클래스에서는'Product'를 갖는'@ ManyToOne'을 가져야합니다. – isah

+0

@arjacsoh : 관계 유지 보수는 어플리케이션의 책임입니다. 삭제할 엔티티가 다른 테이블의 foreign 키의 대상이면 제거를 성공 적으로 수행하려면 외래 키를 지워야합니다. – wypieprz

0

관계를 매핑하는 최대 절전 모드를 사용하면이 두 가지 문제를 알고 있어야합니다 다음 소유자의 관계 어느

  • ? 소유자는 변경 사항이 데이터베이스에 유지되는 관계의 측면입니다. 귀하의 경우 소유자는 파트 개체입니다.
  • 진정한 부모/자식 관계 또는 단순히 구성 관계입니까?
  • 변경 소유권

    • 사용 @ElementCollection 대신 @OneToMany : 귀하의 경우에는 내가 대답은 구성

    당신이 세트를 사용하여 관계를 관리하려면 생각, 당신은 두 가지 옵션이 있습니다 .이런 식으로 뭔가가 :

@OneToMany 
@JoinColumn(name="part_id") 
public Set<Part> getParts() { return parts; } 
void setParts(Set parts) { this.parts = parts; } 
그러나, 두 번째 옵션은 here을하지 않는 것이 좋습니다. 2.2.5.3.1.2 절 참조.

관련 문제