gpt4 book ai didi

java - Hibernate 如何与 @OneToOne 和 Cascade.ALL 配合使用? (使用 Spring )

转载 作者:行者123 更新时间:2023-12-02 04:46:50 25 4
gpt4 key购买 nike

我有一个类 Customer,它与订阅具有 OneToOne 双向关系:

@Entity
@Table(name = "customers")
public class Customer{
@OneToOne(mappedBy="customer",cascade = CascadeType.ALL)
private Subscription currentSubscription;
}

@Entity
@Table(name = "subscriptions")
public class Subscription {

@Id
@Column(columnDefinition = "INT8",name="id", unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="customer"))
private Long id;

@OneToOne
@PrimaryKeyJoinColumn
private Customer customer;
}

现在,当我创建一个具有订阅的客户并在该客户上调用 persist 时,它会很好地将订阅保存到数据库中。但是,当我已经保留了一个客户并想要添加订阅时,它会失败并出现以下错误:

Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.qmino.miredot.portal.domain.Subscription.customer]

我编写了一个测试来解释我想要实现的目标:

@Test
public void shouldCascadeUpdateSubscription(){
Customer owner = customerRepository.save(CustomerMother.getCustomer(false));

Subscription subscription = SubscriptionBuilder.create()
.setBillingDayOfMonth(LocalDate.now().getDayOfMonth())
.setSubscriptionPlan(subscriptionPlan)
.build();

subscription.setCustomer(owner);
owner.setCurrentSubscription(subscription);

customerRepository.save(owner);

Customer result = customerRepository.findOne(owner.getId());
assertThat(result.getCurrentSubscription(),is(notNullValue()));
assertThat(result.getCurrentSubscription().getId(),is(result.getId()));
}

我哪里出错了?

最佳答案

这里的Cascade不是问题,Cascade表示删除或更新时实体要执行的操作。如果你想保存完整的实体,什么是正确的。但为此,您需要拥有正确的数据,您的消息建议它尝试更新 Customer 实体,但它发现了一个空的 AccountDetails,因此为了正确获取其他实体,您需要添加FecthType.EAGER,以获取映射实体的所有属性。

@OneToOne(mappedBy="customer",cascade = CascadeType.ALL, fetch = FetchType.EAGER))

关于java - Hibernate 如何与 @OneToOne 和 Cascade.ALL 配合使用? (使用 Spring ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29600464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com