Jpa 具有复合键的双向@OneToMany关系

Jpa 具有复合键的双向@OneToMany关系,jpa,Jpa,我一直在尝试用复合键创建双向@OneToMany关系,但有些部分缺失或错误 我有一个草案实体,其中包含一系列子草案实体 以下是我得到的: @Entity @Table(name = "draft") @IdClass(Pk.class) public class Draft { @Id @GeneratedValue(strategy=GenerationType.AUTO) protected Long id; @Id protected Intege

我一直在尝试用复合键创建双向@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;
    }
}

在代码行中,此子草稿属性为零,因此不起作用。

您是否设置了关系的两侧?只是您没有发布实际的持久性代码,或者调用了SQL,所以要求人们解释为什么要问LotusAndSetSubDraft做什么?调用的SQL是?好的,setSubDraft在Draft上设置subDraft的实体来完成双向关系。然而,在一些代码行中,这个子草稿属性为nill,因此不起作用。谢谢你的时间!
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;
}