Hibernate 玩框架:如何将一个实体从父类提升为子类

Hibernate 玩框架:如何将一个实体从父类提升为子类,hibernate,playframework,Hibernate,Playframework,假设我有一个对用户操作进行审计的系统: 就像一个叫XXX的用户泡了一杯茶,然后做了…,然后做了 因此有一个包含UserActions(userId,actionId)的表 现在用户已经结婚了,在我的系统上,现在他可以有孩子了,所以我想将普通用户实体提升为已婚用户实体,后者可以有孩子列表(其他普通用户实体) 比如: 具体母公司: @Entity @Inheritance(strategy = InheritanceType.JOINED) public class User extends Mod

假设我有一个对用户操作进行审计的系统: 就像一个叫XXX的用户泡了一杯茶,然后做了…,然后做了

因此有一个包含UserActions(userId,actionId)的表

现在用户已经结婚了,在我的系统上,现在他可以有孩子了,所以我想将普通用户实体提升为已婚用户实体,后者可以有孩子列表(其他普通用户实体)

比如: 具体母公司:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends Model {
}
具体子实体:

@Entity
public class MarriedUser extends User {
    @OneToMany()
    public List<User> children;
}
@实体
公共类MarriedUser扩展了用户{
@OneToMany()
公开儿童名单;
}
我的问题是,如何在控制器中编写代码,将数据库中的实体从父级(用户)提升到子级(MarriedUser)——通常,这是在数据库中完成的,只需在MarriedUser表中插入一条与用户Id相同的新记录(我将InheritanceType合并),因此在数据库中很简单,但是hibernate代码是我不知道的

我告诉你审计信息,因为我不能删除用户XXX,用新id创建一个新的marriedUser,我需要用相同的id


因此,请帮助我使用hibernate代码…

我认为您正面临着滥用继承的问题

您不能在不丢失对象标识的情况下更改对象的类型,因此您不应该使用继承来表示同一对象的不同状态,因为您正试图这样做

您可以使用单独的对象来表示
用户的婚姻状况

@Entity 
public class User extends Model {
    @OneToOne
    public Marriage marriage;
    ...
}

@Entity 
public class Marriage extends Model {
    @OneToMany()
    public List<User> children; 
}
@实体
公共类用户扩展模型{
@奥内托内
公开婚姻;
...
}
@实体
公共阶层婚姻扩展模式{
@OneToMany()
公开儿童名单;
}
或者,您可以将
孩子
移动到
用户
,如果需要,可以使用一些标志来表示婚姻状况


是的,据我所知,没有办法更改Hibernate中现有实体的类型。

我相信您处理问题的方式是错误的。您在这里看到的是一个实体(您的用户)可能处于允许/不允许某些操作的某些状态

通过取消实体及其存储的状态,您可能会获得更大的成功。使用枚举(或类似)存储状态,然后在尝试触发模型上的操作时检查状态是否正确。如果它不是有效状态,则引发异常

用户界面应根据状态代码限制可用操作的范围

@Entity 
 public class User extends Model {

    // this status code could be an enum, or any other type that fits
    public int statusCode;

    ...

    public void action() {
        if(statusCode != 1){
          throw new IllegalStateException("State 1 required for this action");
        }
        //code for action
    }
 }