我试图了解使用JPA处理持久对象的正确方法。我创建了四个相关对象,每个对象拥有一个Set<?>
个孩子。我添加了双向映射。我创建了一个测试,我在链中添加了一个,然后尝试保留该集。看来我不能超越直接的关系。是这样的吗?我是否需要为每个执行向父级添加子级而不是直接使用访问者的对象构建服务?
好的,我们说我有这些东西:
@Entity
public class A implements Serializable
{
@Id
@GeneratedValue
private Long id;
@OneToMany(targetEntity = B.class
, mappedBy = "a"
, cascade = CascadeType.ALL
, fetch = FetchType.LAZY
)
private Set<B> bs;
}
@Entity
public class B implements Serializable
{
@Id
@GeneratedValue
private Long id;
@ManyToOne(optional = false
, cascade = CascadeType.ALL)
@JoinColumn(name = "a_id", referencedColumnName = "id")
private A a;
@OneToMany(targetEntity = C.class
, mappedBy = "b"
, cascade = CascadeType.ALL
, fetch = FetchType.LAZY
)
private Set<C> cs;
}
@Entity
public class C implements Serializable
{
@Id
@GeneratedValue
private Long id;
@ManyToOne(optional = false
, cascade = CascadeType.ALL)
@JoinColumn(name = "b_id", referencedColumnName = "id")
private B b;
@OneToMany(targetEntity = D.class
, mappedBy = "c"
, cascade = CascadeType.ALL
, fetch = FetchType.LAZY
)
private Set<D> ds;
}
@Entity
public class D implements Serializable
{
@Id
@GeneratedValue
private Long id;
@ManyToOne(optional = false
, cascade = CascadeType.ALL)
@JoinColumn(name = "c_id", referencedColumnName = "id")
private C c;
}
然后,我创建其中一个并将其添加到前一个亲戚:
A a = new A();
B b = new B();
a.getBs().add(b);
C c = new C();
b.getCs().add(c);
D d = new D();
c.getDs().add(d);
如果我坚持(dService.save(d);
)它就会失败,因为C的身份不存在。由于必须通过保存它来生成值,我本来希望它以递归方式向上移动并首先保存A,然后从那里填写。如果我从A(aService.save(a);
)开始,我在B上得到相同的错误。它表现得像没有级联。