gpt4 book ai didi

java - 如何更改 JPA 中现有实体的类型

转载 作者:行者123 更新时间:2023-12-01 22:35:09 25 4
gpt4 key购买 nike

我有一个使用 Spring Boot 和 JPA 构建的 Web 应用程序,我想更改已保存在数据库中的实体的类型。让我通过一个例子更好地解释它。

我有一个实体 Person

@Entity
public class Person{
@Id
private Long personId;
private String name;
@OneToMany(mappedBy = "owner")
private List<Car> cars;
...
}

@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {}

此人可能拥有一辆或多辆汽车,由实体类型 Car 表示:

@Entity
public class Car{
@Id
private Long carId;
@ManyToOne
@JoinColumn(name = "owner_id")
private Person owner;

}

@Repository
public interface CarRepository extends JpaRepository<Car, Long> {}

还有一个继承自 Person 的 Employee 类:

@Entity
public class Employee extends Person{
private String employeeId;
...
}

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}

假设我们在数据库中保留了一个 Person 类型的实体。几个月后,此人成为员工,因此我们必须更改已保存在数据库中的此实体的类型,从个人更改为雇主,而不会丢失任何信息(包括他可能拥有的汽车列表)。

有正确的方法吗?

最佳答案

如果我正确理解了问题,您的应用程序支持 Person 的升级至Employee并且您希望使用数据库中已有的记录并使用新属性进行更新(例如 employeeId )。

我认为这是Inheritance strategy的问题。您有两个类(class):PersonEmployee ,与 Employee Person 的子类。您需要决定使用哪些表来存储Employee对应的记录。和Person对象。

如果您为每个实体类选择不同的表,那么您必须手动处理 Person升级Employee (也就是说,您删除一个表中的记录并将其添加到另一个表中)。但是,如果您选择将两个实体存储在单个表中,则可以使用相同的记录。请参阅 the document 中的“单表”部分。

为此,您还需要确保类之间的唯一 ID 相同 PersonEmployee (例如 personId )。否则,您仍然会有两个不同的记录(在同一个表中)。

另一方面,正如我在开头提到的,只要您接受删除 Person ,任何继承策略都可以工作。实体并创建 Employee升级时的实体。这种删除/创建通常具有复杂性,具体取决于现有关系和完整性约束。

关于java - 如何更改 JPA 中现有实体的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58529197/

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