Как изменить тип существующей сущности в JPA - PullRequest
0 голосов
/ 23 октября 2019

У меня есть веб-приложение, созданное с использованием Spring Boot и JPA, и я хотел бы изменить тип сущности, уже сохраненной в базе данных. Позвольте мне объяснить это лучше на примере.

У меня есть лицо 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> {}

и класс Employee, который наследуется от Person:

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

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

Допустим, мы сохраняем сущность типа Person внутри базы данных. Через пару месяцев это лицо становится сотрудником, поэтому мы должны изменить тип этого лица, уже сохраненного в базе данных, с лица на работодателя, не теряя никакой информации (включая список автомобилей, которые он может иметь).

Есть ли правильный способ сделать это?

1 Ответ

0 голосов
/ 23 октября 2019

Если я правильно понимаю проблему, ваше приложение поддерживает обновление Person до Employee, и вы хотите, чтобы уже существующая в базе данных запись использовалась и обновлялась новыми атрибутами (например, employeeId).

Я думаю, что это проблема Стратегия наследования . У вас есть два класса: Person и Employee, с Employee подклассом Person. Вам необходимо решить, какие таблицы будут использоваться для хранения записей, соответствующих Employee и Person объектам.

Если вы выберете отдельную таблицу для каждого класса сущностей, вам придется вручную обработать обновление из Person до Employee (то есть вы удалите запись в одномстол и добавить его в другой). Однако, если вы решите сохранить обе сущности в одной таблице, вы можете использовать одну и ту же запись. См. Раздел «Одна таблица» в документе .

Чтобы это работало, вам также необходимо убедиться, что уникальный идентификатор одинаков между классами Person и Employee (например, personId). В противном случае у вас по-прежнему будут две разные записи (в одной таблице).

С другой стороны, как я упоминал в начале, любая стратегия наследования будет работать, если вы согласитесь удалить Person сущность и создайте новую Employee сущность при обновлении . Это удаление / создание часто имеет сложность в зависимости от существующих отношений и ограничений целостности.

...