我有一个使用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类型的实体。几个月后,此人成为一名雇员,因此我们必须将已经保留在数据库中的该实体的类型从“人”更改为“雇主”,而不会丢失任何信息(包括他可能拥有的汽车清单)。
有正确的方法吗?
答案 0 :(得分:0)
如果我正确理解了问题,则您的应用程序支持将Person
升级到Employee
,并且您希望使用数据库中已经存在的记录并使用新属性(例如{ {1}}。
我认为这是Inheritance strategy的问题。您有两个类:employeeId
和Person
,其中Employee
是Employee
的子类。您需要确定将使用哪些表来存储与Person
和Employee
objetcs相对应的记录。
如果为每个实体类选择一个不同的表,则必须手动处理Person
到Person
的升级(即,删除记录在一个表中并将其添加到另一个表中)。
但是,如果您选择将两个实体都存储在一个表中,则可以使用相同的记录。请参见the document中的“单个表”部分。
要执行此操作,还需要确保类Employee
和Person
(例如Employee
)之间的唯一ID相同。否则,您仍将有两条不同的记录(在同一表中)。
另一方面,正如我在开头所提到的,只要您接受删除personId
实体并创建 new {{1} } 升级后的实体。根据现有关系和完整性约束,此删除/创建通常具有复杂性。