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

时间:2019-10-23 18:40:40

标签: java hibernate jpa

我有一个使用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类型的实体。几个月后,此人成为一名雇员,因此我们必须将已经保留在数据库中的该实体的类型从“人”更改为“雇主”,而不会丢失任何信息(包括他可能拥有的汽车清单)。

有正确的方法吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了问题,则您的应用程序支持将Person升级到Employee,并且您希望使用数据库中已经存在的记录并使用新属性(例如{ {1}}。

我认为这是Inheritance strategy的问题。您有两个类:employeeIdPerson,其中EmployeeEmployee的子类。您需要确定将使用哪些表来存储与PersonEmployee objetcs相对应的记录。

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

要执行此操作,还需要确保类EmployeePerson(例如Employee)之间的唯一ID相同。否则,您仍将有两条不同的记录(在同一表中)。

另一方面,正如我在开头所提到的,只要您接受删除personId实体并创建 new {{1} } 升级后的实体。根据现有关系和完整性约束,此删除/创建通常具有复杂性。