Hibernate:将基类的实例更改为子类

A. *_*ips 7 java hibernate jpa

我想将一个具体的超类更改为其子类之一.我在下面列举了一个例子:

@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;
 ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的三个班级是员工,经理和历史.所有经理都是员工,但并非所有员工都是经理.所有员工(和经理)都有历史记录.员工可能会晋升为管理层.发生这种情况时,应通过保持员工ID相同来保留员工的历史记录.这样可以轻松找到经理人的就业历史.

由于数据库受到限制,实施促销操作变得复杂:数据库不允许删除旧的Employee并创建具有相同ID的新Manager,而不通过级联操作删除所有History对象 - 人力资源部门不允许这样做,否则我的工作很简单!

是否可以在不诉诸自定义SQL操作的情况下 Manager(新管理器)行添加附加到现有Employee?

我尝试了以下解决方案但没有成功:

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 );
}
Run Code Online (Sandbox Code Playgroud)

... 要么 ...

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 );
}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?我甚至在使用detach()merge()的正确轨道上?

这可能在Hibernate/JPA中吗?

在这一点上任何想法都会有所帮助,因为我很难过!

  • 亚伦

Rya*_*art 6

正如你无疑开始看到的那样,你在这里逆风而行.不幸的是,看起来你有一个使用继承来表示角色的经典例子.Hibernate - 一个Object -Relational Mapper - 和Java--一个面向对象的语言 - 都会在这个问题上打击你,因为你的对象模型是错误的.我想说你最好的办法是通过重构和数据迁移来解决它.最终结果应该是每个人都是员工,而一些员工与一个或多个部门或其他员工之间存在某种"管理"关系.