我在写一个简单的订单-付款一对一关联:
@Entity
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
(...)
@OneToOne(cascade=CascadeType.ALL, mappedBy="order")
private Payment payment;
付款类别相关代码:
@Entity
public class Payment implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@MapsId
private Order order;
然后,我想实现一个基本方法,使用Spring Data JPA存储库为测试数据库种子化,但如果我尝试以下代码,我会得到一个PersistentObjectException
表示Detached entity Pass to Persist
:
Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
orderRepository.save(o1);
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
paymentRepository.save(p1);
如果我尝试这样做,也会出现同样的问题:
Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
orderRepository.save(o1);
paymentRepository.save(p1);
它的唯一工作方式如下:
Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
o1.setPayment(p1);
orderRepository.save(o1);
paymentRepository.save(p1);
我想明白为什么只有最后一种方法有效。在多对一关联中,我不必在保存之前设置双向关联,以便工作。我在这个案例中遗漏了什么关于超脱实体的行为?多谢了。
因为我们必须为父实体设置子实体,就像您使用O1.setPayment(p1);
所做的那样
不需要将id作为null传递,因为它将是@generatedvalue
。您可能必须为它们创建适当的构造函数。
当您正在使用cascade=cascadeType.all
时,您可以将父实体和子实体保存如下,不需要对这两个实体都使用save()
//save Parent-Child at same
@PostMapping(value = "/onetoone")
public String OneToOne(@RequestBody ParentOne parent)
{
ChildOne childOne = parent.getChildOne();
childOne.setParentOne(parent);
parent.setChildOne(childOne);
parentOneRepository.save(parent);
return "saved";
/*{
"parentName":"Parent Name",
"childOne":{
"childName":"Child Name"
}
}*/
}
讨论
我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不
我在stackoverflow上读了很多关于相同异常的文章,但没有找到任何实际帮助我的东西,所以我在这里:
另外,我有一个IOC托管bean,它内部有一个事务方法。 有2个实体具有单向Many2One-- AuModule在上没有引用
初始数据。专业有很多科目。 专业JAVA 对于一个主题来说,专业不能为空。我希望它能以下一种方式工作:当我保存/更新/分离一个主题时,同样的操作必须应用于专业。当我删除一个主题时,专业不会发生任何变化。 主题JAVA 我写了一个集成测试。生成专业()和生成主题()这只是util方法。 你可以在这张图片上看到测试结果。 subjectService在此处引发了异常。保存(主题1); 原因:org。冬
我有一个JPA持久化的对象模型,它包含多对一的关系:一个有许多。一个有一个。 下面是代码片段: 我能够创建对象,向其添加事务,并正确地持久化对象。但是,当我创建一个事务,使用一个现有的已经持久化的帐户,并持久化该事务时,我会得到一个异常: 原因:org.hibernate.PersistentObjectException:已分离的实体传递给Persist:com.PaulSanwald.Acco
我编写了第一个java应用程序来读取rss流,并使用,,。我的模特<代码>RssFeed: : 和: 我使用处理数据。如果不使用多对多功能保存RssFeed,则可以: 但当我加上一句话: 获取异常:。 我的RssFeedServiceImpl: } 和RssCategoryServiceImpl: 拯救多少对多少?