2015-01-19 2 views
0

단일 테이블 (자식)을 공유하는 여러 테이블 (부모) 간의 관계를 모델링하는 데 어려움을 겪고 있습니다.하나의 자식/다중 부모 테이블 모델링

@Entity 
@Table (name="parent1") 
public class ParentEntity1 { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    // relationship with child table 

    @OneToMany(mappedBy = "parentId", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    private Set<ChildEntity> children; 


    // other columns of parent 1 


} 

다음과 같은 자식 테이블 :

는 다음 상위 1 표를 감안할 때 (다른 부모 테이블 2, 3 등은 유사하다)

@Entity 
@Table (name="children") 
public class ChildEntity { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    // points to the parent type; 1, 2, and so on 
    @Column(name="parent_type") 
    private Integer parentType; 

    @Column(name="parent_id") 
    private Integer parentId; 

    // some other data that belongs to ChildEntity 

} 

은 어떻게 하나를 지속 할 관계를 생성하는 동안 부모 개체 및 여러 자식? 부모 형식은 자식 테이블의 열이며 부모 및 자식 ID는 모두 자동 생성된다는 점에 유의하십시오.

+0

'ChildEntity'의'parentType'과'parentId'는 나쁜 생각입니다. JPA는이를 지원할 수 없습니다. – holmis83

+0

parentType을 없애려면 각 부모에 대해 하나의 하위 테이블을 사용하는 것이 좋습니다.하지만 피할 수는 없지만 대안을 볼 수는 없습니다. – ps0604

+0

데이터베이스 모델이 있습니까? – holmis83

답변

0

실제로해야 할 일은 ParentEntity를 ChildEntity에 첨부하는 것입니다. JPA에서는 m : 1과의 관계가 @JoinColumn에 의해 실현됩니다. 하위 엔티티에 상위 유형을 저장할 필요가 없습니다. 이는 잘못된 설계의 징조입니다. 상위 유형은 가능한 한 해당 엔티티와 가깝도록해야합니다.

ParentEntity pOne = new ParentEntity1(); 
ParentEntity pTwo = new ParentEntity2(); 

ChildEntity c1 = new ChildEntity(); 
ChildEntity c2 = new ChildEntity(); 
ChildEntity c3 = new ChildEntity(); 

Set<ChildEntity> childrenOne = new HashSet<>(); 
childrenOne.add(c1); 
childrenOne.add(c2); 

Set<ChildEntity> childrenTwo = new HashSet<>(); 
childrenTwo.add(c3); 

pOne.setChildren(childrenOne); 
pOne.setType(1); 

// ... 
em.getTransaction().begin(); 
em.persist(pOne); 
em.getTransaction().commit(); 
// ... 

pTwo.setChildren(childrenTwo); 
pTwo.setType(2); 


// ... 
em.getTransaction().begin(); 
em.persist(pTwo); 
em.getTransaction().commit(); 
// ... 

그 모든 : 당신이 그런 일을 할

@Entity 
@Table (name="children") 
public class ChildEntity { 

    @Id Integer parentId; 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name="parent") 
    private ParentEntity parent; 

    // some other data that belongs to ChildEntity 
    //all setters and getters/lombok 

} 

@MappedSuperclass 
public abstract class ParentEntity { 
    @OneToMany(mappedBy = "parentId", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    private Set<ChildEntity> children;  


    @Column(name="parent_type") 
    private Integer parentType; 

    //all setters and getters/lombok 
} 


@Entity 
@Table (name="parent1") 
public class ParentEntity1 extends ParentEntity { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id;  

    // other columns specific to parent 1 

    //all setters and getters/lombok 
} 


@Entity 
@Table (name="parent2") 
public class ParentEntity2 extends ParentEntity { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id;  

    // other columns specific to parent 2 

    //all setters and getters/lombok 
} 

를 여러 아이들과 부모를 지속 : 그래서 단순히 개체에 넣어. ParentEntity 클래스를 인스턴스화하지 않는다는 점에주의하십시오. 각각이 id로 단일 하위 테이블을 참조하는 여러 개의 상위 테이블을 가질 수 있습니다. 또한 ParentEntity의 상속을 통해 클래스의 각 후속 부모 엔터티 유형에 대한 정보를 저장합니다. 나는 그것이 당신의 문제를 해결하기를 바랍니다.

+0

'Children' 클래스에서'ParentEntity'를 참조하거나, 그것은 일반적인 클래스입니까? 아니면'ParentEntity1'을 의미합니까? 후자의 경우 'ParentEntity2','ParentEntity3' 등은 어떻게됩니까? – ps0604

+0

내 답변을 업데이트했습니다. – iku

+0

하위 엔티티의 상위 열이 상위 1 및 하위 2에 대해 반복되는 경우 어떻게됩니까? 그 시스템이 어떤 부모에게 자녀의 행이 관련되어 있는지 어떻게 알 수 있습니까? – ps0604

관련 문제