2015-01-28 2 views
0

복합 키를 사용하여 양방향 @OneToMany 관계를 만들려고했지만 일부 조각이 누락되었거나 잘못되었습니다.복합 키를 사용한 Bidrectional @OneToMany 관계

하위 초안 엔터티 목록을 보유하는 초안 항목이 있습니다.

@Entity 
@Table(name = "draft") 
@IdClass(Pk.class) 
public class Draft { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    protected Long id; 
    @Id 
    protected Integer rev; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "draft") 
    List<SubDraft> subDrafts = new ArrayList<SubDraft>(); 

    // getters/setters omitted 
} 

@Entity 
@Table(name = "sub_draft") 
@IdClass(PK.class) 
public class DraftToDoDAO { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    protected Long id; 
    @Id 
    protected Integer rev; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name = "draft_id", referencedColumnName = "id"), 
     @PrimaryKeyJoinColumn(name = "draft_rev", referencedColumnName = "rev")  
    }) 
    protected DraftDAO draft; 

    // getters/setters omitted 
} 

public class PK implements Serializable { 
    protected Long id; 
    protected Integer rev; 

    public PK() { 

    } 

    public PK(Long id, Integer rev) { 
     this.id = id; 
     this.rev = rev; 
    } 

    public Long getId() { 
     return id; 
    } 

    public Integer getRev() { 
     return rev; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     result = prime * result + ((rev == null) ? 0 : rev.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     MetaDataDAO other = (MetaDataDAO) obj; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     if (rev == null) { 
      if (other.rev != null) 
       return false; 
     } else if (!rev.equals(other.rev)) 
      return false; 
     return true; 
    } 
} 

나는 서브 초안의 목록 초안을 저장 아무런 문제가 없지만 관계는 두 가지 방법으로 생성되지 않습니다 : 여기에

은 내가 가진 것입니다.

하위 초안 테이블에서 SchemaTool (DataNucleus)은 draft_id라는 열을 작성하지만 비어 있습니다. 그리고 내가 왜 (draft_id, draft_rev) 지정된 컬럼을 생성하지 않고 그 관계를 정착시키는 지 궁금합니다.

답변을 많이 검색하지만 일할 수 없습니다.

귀하의 도움에 감사드립니다! 감사합니다. .

EDIT! 코드의 라인을 따라이 subDraft 속성이 nilled되고 그러므로 작동하지 않았다

public Draft create(Draft draft, SubDraft subDraft) { 
    EntityManager em = PersistenceHelper.getEntityManager(); 

    draft.setCreated(Calendar.getInstance()); 

    // This should do it 
    draft.setSubDraft(subDraft); 
    subDraft.setDraft(draft);  

    em.persist(draft); 
    em.close(); 

    return draft; 
} 
+0

당신은 관계의 양쪽을 설정 했습니까? 그냥 실제 퍼시스턴스 코드를 게시하지 않거나 SQL을 호출하여 사람들에게 왜 많은 것을 묻는 지 묻는 이유는 –

+0

이며 setSubDraft는 무엇을합니까? 그리고 호출 된 SQL은 무엇입니까? –

+0

좋아요, setSubDraft는 Draft에서 subDraft의 엔티티를 양방향 관계를 완료하도록 설정합니다. 그러나 코드 줄을 따라이 subdraft 속성이 처리되지 않아 작동하지 않는 경우도 있습니다. 시간 내 주셔서 감사합니다. – user3185066

답변

0

일부 : 다음은 실제 지속성 코드입니다.