Я хотел бы изменить конкретный суперкласс на один из его подклассов. Ниже приведен пример:
@Entity
@Table(name = "employees")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
@Column(name = "id")
private String id;
public Employee( String id ) {
this.id = id;
}
...
}
@Entity
@Table(name = "managers")
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
public class Manager extends Employee {
public Manager( String id ) {
super(id);
}
...
}
@Entity
@Table(name = "history")
public class History {
...
/**
*
*/
@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;
...
}
Три класса, с которыми я работаю, - «Сотрудник», «Менеджер» и «История». Все руководители являются сотрудниками, но не все сотрудники являются руководителями. Все сотрудники (и руководители) имеют историю. Сотрудники могут быть повышены в должности до уровня «Менеджмент». В этом случае следует сохранить историю сотрудника, сохранив его идентификатор. Это позволит легко найти Историю Менеджера через занятость.
Реализация рекламной операции осложняется ограничениями внутри базы данных: база данных не позволит удалить старого Сотрудника и создать нового Менеджера с тем же идентификатором без удаления всех объектов Истории с помощью каскадной операции, что Human Resources не позволит, в противном случае моя работа будет легкой!
Можно ли добавить или присоединить строку менеджера (новых менеджеров) к существующему сотруднику, не прибегая к пользовательской операции SQL?
Я безуспешно пробовал следующие решения:
public void promote( Employee employee ) {
/* copy over the ID of the employee to the manager. Will not work because employee with ID already exists */
Manager manager = new Manager(employee.getId());
this.entityManager.persist( manager );
}
... или...
public void promote( Employee employee ) {
/* detach the employee then merge. Will not work: fails, again, with a NonUniqueObject Exception */
this.entityManager.detach( employee );
Manager manager = new Manager(employee.getId());
this.entityManager.merge( manager );
}
Как это сделать? Я даже на правом треке с отсоединить () и объединить () ?
Возможно ли это в Hibernate/JPA?
Любые идеи будут полезны в этот момент, так как я остановлен!
Есть проблема, которую я сейчас расследую: после того, как коллега ушел, однажды ночью некоторые файлы, которые он создал, по сути, все его работы над завершенным проектом, за который босс ему не заплатил, были удалены. Насколько я знаю, все полномочия доступа были изменены.
Можно ли сделать это, настроив файл для выполнения задачи удаления, а затем удалив соответствующий файл? Или что-то подобное, что изменило бы код после выполнения задачи? Это невозможно отследить? (я думаю, что он мог бы ловко замаскировать запрос как обычный запрос, и я проскочил через базу кода и через необработанные журналы доступа и ничего не нашел).