2010-01-24 2 views
1

부모 개체와 자식 개체가 두 개 있다고 가정합니다. 아이가 부모 엔티티와 참조에 지정된 관계를 갖기를 원하지만 부모가 그것에 대해 알 필요가 없기를 바랍니다. 그 이유는 이러한 관계가 수없이 많기 때문이며 모든 어린이들에 대한 관계를 명시 적으로 지정하면 부모 개체를 지속적으로 업데이트하고 오염시키는 것을 의미하기 때문입니다. 그러나 나는 여전히 자식 개체에 캐스케이드 할 부모 개체를 삭제하려고합니다. 추가 제약 조건으로 자식 객체는 부모의 ID를 참조하는 속성을 설정하여 상위 엔티티 집합에 대한 참조 만 갖습니다. 내가 좋아하는 뭔가를 가정하면 :Hibernate - 단방향 하위 관계 만이 지정된 주석을 사용하여 계단식 삭제하는 방법

@Entity 
class Child { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(nullable=false) 
    private Long parentId; 

    @ManyToOne(fetch=FetchType.LAZY, optional=false) 
    @JoinColumn(name="parentId", insertable=false, updatable=false, nullable=false, unique=false) 
    private Parent parentEntity; 

    // etc... 

} 

@Entity 
class Parent { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    // etc... 
} 

그런 다음 부모 개체에 추가 관계를 추가하지 않고 아이를 캐스케이드 할 수있는 부모 개체의 삭제 방법은 없나요?

JPA 주석 만 사용하는 솔루션이 선호되지만 도움이 될 것입니다.

답변

3

아니요. 불가능합니다.

계단식 관계를 횡단합니다. JPA에게 A에서 B까지의 관계에 대해 말하지 않으면 (B에서 A까지의 관계가 있음에도 불구하고) JPA는 자동으로 그것을 통과 할 수 없습니다.

부모 엔티티보다는 상위 ID 만 지정하면 더 어려워 질 것입니다. Hibernate/JPA는 당신이하고있는 일에 대한 올바른 도구가 아니거나 그것이 어떻게 작동 하는지를 받아 들일 필요가있다. 이것은 객체 관계를 지정하고 유지하는 것을 의미한다.

1

부모 대신 직접 parentId를 추가하면 삶의 질이 향상됩니다. Hibernate는 id를 데이터베이스에만 저장하고있다. 그래서 당신 스스로 그것을하는 당신의 요점은 무엇입니까? 문제로 돌아 가기. 관계를 양방향으로 만들고 cascade = CascadeType.ALL을 자신의 mappedBy = "parent"인 children 속성에 추가해야합니다. 작고 쉽습니다. 빠릅니다.

+0

이 개체를 만든 시점에서 부모 호출 ID (RPC 호출을 통해 제공됨) 만 있으므로 다른 조회를 수행하지 않고 추가하는 것이 편리합니다. –

+1

session.load (Parent.class, parentId)를 사용하면 실제로 데이터베이스를 쿼리하지 않고도 문에서 사용할 수있는 자리 표시자를 만들 수 있습니다. – whiskeysierra

관련 문제