与复合键的双向@OneToMany关系

时间:2015-01-28 13:02:09

标签: jpa

我一直在尝试使用复合键创建双向@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! 这是实际的持久性代码:

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;
}

1 个答案:

答案 0 :(得分:0)

在某些代码行中,此subDraft属性已被填充,因此无效。