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;
}
당신은 관계의 양쪽을 설정 했습니까? 그냥 실제 퍼시스턴스 코드를 게시하지 않거나 SQL을 호출하여 사람들에게 왜 많은 것을 묻는 지 묻는 이유는 –
이며 setSubDraft는 무엇을합니까? 그리고 호출 된 SQL은 무엇입니까? –
좋아요, setSubDraft는 Draft에서 subDraft의 엔티티를 양방향 관계를 완료하도록 설정합니다. 그러나 코드 줄을 따라이 subdraft 속성이 처리되지 않아 작동하지 않는 경우도 있습니다. 시간 내 주셔서 감사합니다. – user3185066