Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改JPA中现有实体的类型_Java_Hibernate_Jpa - Fatal编程技术网

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

Java 如何更改JPA中现有实体的类型,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个用Spring Boot和JPA构建的web应用程序,我想更改数据库中已持久化的实体的类型。 让我通过一个例子更好地解释一下 我有一个人 @Entity public class Person{ @Id private Long personId; private String name; @OneToMany(mappedBy = "owner") private List<Car> cars; ... } @R

我有一个用Spring Boot和JPA构建的web应用程序,我想更改数据库中已持久化的实体的类型。 让我通过一个例子更好地解释一下

我有一个人

@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> {}
@实体
公共阶层人士{
@身份证
私人长人形;
私有字符串名称;
@OneToMany(mappedBy=“所有者”)
私家车名单;
...
}
@存储库
公共接口PersonRepository扩展了JpaRepository{}
此人可能有一辆或多辆汽车,由实体类型汽车表示:

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

}

@Repository
public interface CarRepository extends JpaRepository<Car, Long> {}
@实体
公车{
@身份证
私人长龋;
@许多酮
@JoinColumn(name=“owner\u id”)
私人业主;
}
@存储库
公共接口CarRepository扩展了JpaRepository{}
以及从Person继承的员工类别:

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

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}
@实体
公共类雇员扩展个人{
私有字符串employeeId;
...
}
@存储库
公共接口EmployeeRepository扩展了JpaRepository{}
假设我们在数据库中持久化Person类型的实体。几个月后,此人成为一名员工,因此我们必须在不丢失任何信息(包括他可能拥有的汽车列表)的情况下,将已保存在数据库中的该实体的类型从一个人更改为另一个雇主


有正确的方法吗?

如果我正确理解了问题,您的应用程序支持将
人员
升级到
员工
,并且您希望使用数据库中已有的记录并使用新属性(例如
员工ID
)进行更新

我认为这是一个安全问题。您有两个类:
Person
Employee
,其中
Employee
Person
的子类。您需要决定将使用哪些表来存储与
Employee
Person
对象对应的记录

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

为此,您还需要确保类
Person
Employee
之间的唯一id相同(例如
personId
)。否则,仍将有两条不同的记录(在同一个表中)


另一方面,正如我在开始时提到的,只要您接受在升级时删除
个人
实体并创建新的
员工
实体,任何继承策略都会起作用。根据现有关系和完整性约束,此删除/创建通常具有复杂性

对。这可能是表达问题的最简单方式。JPA的关键设计原则是,与应用程序的数据层进行交互,就像与常规Java对象进行交互一样。您可以更改常规Java对象的类型吗?好吧,这是你的答案。我可以在不自动失去关系的情况下删除一个人吗(例如汽车列表)?我假设汽车没有这个人就没有存在的理由。在这种情况下,如果您配置完整性约束以使数据库正常化,则车辆将自动删除,或者您必须在删除人员之前(手动)删除它们。如果您实际上能够删除Person并保留汽车的“孤立”记录,这意味着您的完整性约束配置不当,这很容易出错,此外,您的数据库中还保留了孤立记录(这些记录占用空间而没有用处)。