gpt4 book ai didi

java - Hibernate:如何保留顺序相关信息

转载 作者:行者123 更新时间:2023-12-02 10:09:47 24 4
gpt4 key购买 nike

在我的应用程序中,用户下订单并将帐单地址设置为与他映射的地址之一。现在,将来他会编辑该地址。因此我的订单将映射到该更新后的地址。

我的订单实体

@Entity
public class Orders{
...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@OneToOne
private Address address;
...
}

地址实体

@Entity
@Table(name = "address")
public class Address {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String address1;

...

}

人实体

@Entity
public class Person{
...
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Address> addresses = new HashSet<>();
...
}

我希望我的订单实体拥有创建订单期间的地址副本。创建订单后,用户在其个人资料中对地址进行的任何更改都不会对该订单产生影响。

最佳答案

我假设您允许用户从他的地址列表(Person#address)中选择地址,因此当您提交订单时,它包含数据库中已有的地址,包括创建的id关系,不创建记录:

{
user: {
id: 10,
email: "user@stackoverflow.com"
},
address: {
id: 10,
street: "5th Av"
}
}

如果您想“拥有地址的副本”,那么您应该首先更新 Order 类中的关系,例如:

  @OneToOne(cascade = CascadeType.ALL)
private Address address;

然后发送不带id的地址,这将指示您的存储库在数据库中创建一个新条目。

Json 选项:

{
user: {
id: 10,
email: "user@stackoverflow.com"
},
address: {
street: "5th Av", ...
}
}

或者通过删除 Controller 上的id:

@PostMapping("/submit-order")
public Order submitOrder( @RequestBody Order order) {
// Remove Order#id to detatch current record and enforce create a new one
order.getAddress().setId(null);
return this.orderRepository.save(order);
}

这样您的订单就有了唯一的地址副本。

错误:org.springframework.orm.jpa.JpaSystemException,消息“地址已从 1 更改为 null”

如果您收到此错误,是因为您正在删除事务或 session 范围内的实体 ID。您应该在该范围之外创建实体的副本,或者使用实体管理器分离实体,这里是 example

@embeddable 解决方案

另一种解决方案是使用可嵌入对象,这样您可以将地址字段存储在订单表上,但将它们作为复合对象:

首先,您创建一个包含所有必填字段的订单地址对象,并使用 @Embeddable 注释对其进行标记:

@Embeddable
public class AddressOrder {
@Column("street")
private String street;
@Column("postal_code")
private String po;
@Column("city")
private String city;
@Column("country")
private String country;

// Getters and setters
}

然后,您使用订单表上的对象作为属性,并使用 @Embedded 注释对其进行标记。

@Entity
public class Orders {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@Embedded
private AddressOrder address;

// Getters and setters
}

您需要根据您要使用的数据库方法选择解决方案。

关于java - Hibernate:如何保留顺序相关信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55079842/

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