Jpa 具有复合键的双向@OneToMany关系
我一直在尝试用复合键创建双向@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
@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;
}