我一直在尝试使用复合键创建双向@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;
}
答案 0 :(得分:0)
在某些代码行中,此subDraft属性已被填充,因此无效。