Hibernate: измените экземпляр базового класса на подкласс

Я хотел бы изменить конкретный суперкласс на один из его подклассов. Ниже приведен пример:

@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?

Любые идеи будут полезны в этот момент, так как я остановлен!

  • Аарон
-121--1481334- php скрипт, который удаляет себя после завершения Есть проблема, которую я сейчас расследую: после того, как коллега ушел, однажды ночью некоторые файлы, которые он создал, по существу всю свою работу над завершенным проектом, за который босс ему не заплатил, получил...

Есть проблема, которую я сейчас расследую: после того, как коллега ушел, однажды ночью некоторые файлы, которые он создал, по сути, все его работы над завершенным проектом, за который босс ему не заплатил, были удалены. Насколько я знаю, все полномочия доступа были изменены.

Можно ли сделать это, настроив файл для выполнения задачи удаления, а затем удалив соответствующий файл? Или что-то подобное, что изменило бы код после выполнения задачи? Это невозможно отследить? (я думаю, что он мог бы ловко замаскировать запрос как обычный запрос, и я проскочил через базу кода и через необработанные журналы доступа и ничего не нашел).

5
задан Valentin Brasso 18 September 2011 в 11:59
поделиться