Jpa OneToMany不坚持孩子

Jpa OneToMany不坚持孩子,jpa,jpa-2.0,Jpa,Jpa 2.0,我很难坚持一个领域。这是两个简化的类 我正在做测试 public class User implements Serializable { ... private String name; ... @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<PhoneNumber> phoneNumbers; ... } public class PhoneNumber implements Seria

我很难坚持一个领域。这是两个简化的类 我正在做测试

public class User implements Serializable {
...
private String name;
...
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<PhoneNumber> phoneNumbers;
...
}

public class PhoneNumber implements Serializable {
...
private String phoneNumber;
...
@ManyToOne()
private User  user;
...
}
但是当我持久化用户u时,phoneNumber子项不会自动持久化。 以面向对象的方式,我只需要做一对多的合成

我用日食


非常感谢大家的提示。

您需要在两个方向上建立关系。将
p.setUser(u)
添加到您的代码中:

User u = new User();
PhoneNumber p = new PhoneNumber();
u.setName("Alan");
u.getPhoneNumbers.add(p);
p.setUser(u);

您确定必须设置两个方向才能持久化PhoneNumber实体吗?@Pedro如果它是双向关系(如问题的代码段所示):是的。这是因为PhoneNumber是关系的反向吗?我成功地坚持了上面提到的结构,而没有设置关系的第二个方面。PhoneNumeber.user设置为null,但已成功持久化。请看JPA 2.0规范3.2.4“托管实体之间的双向关系将基于关系拥有方持有的引用而持久化。开发人员有责任在更改“Ok”时保持拥有方持有的内存中引用和反向持有的内存中引用彼此一致,我理解,所以在调用persist(u)之后,数据库中的一切都正常,但是内存中的引用是错误的,对吗?我不确定。我没有尝试使用上面的代码,但我记得我的一个项目中出现了与问题中报告的相同的行为,问题通过添加反向关系得到解决,如我的答案所示。嗯…不,在调用persist(u)之后,数据库和内存中的表示都是“错误的”。所谓“错”,我的意思是没有从电话号码到用户的参考。在数据库和内存中,它只是“null”。我想说的是,这种情况不会阻止子元素(PhoneNumber)的持久性。它被正确地添加到数据库中,并且可以使用EntityManager获取。我只是不知道为什么OP代码在他的例子中不起作用……这有点奇怪——这样的例子在我的例子中效果很好(EclipseLink)。最后你只做了一个完整的管理者——坚持(u)?您如何知道该值未被持久化—在数据库中进行检查或以某种方式查询实体?你试过刷新整个管理器吗?
User u = new User();
PhoneNumber p = new PhoneNumber();
u.setName("Alan");
u.getPhoneNumbers.add(p);
p.setUser(u);