JPA继承:将派生实体映射到不同的表

JPA继承:将派生实体映射到不同的表,jpa,eclipselink,single-table-inheritance,Jpa,Eclipselink,Single Table Inheritance,我使用SINGLE_TABLE继承startegy映射我的usres,请参见下面的代码示例 是否有一种方法可以将未激活的RegularUser和未激活的Business User从ACTIVE_USERS表映射到另一个表(例如,未激活的_USERS)并保持继承起始状态 注: -这里的要点是避免前RegularUser和UnActiveRegularUser之间的代码重复,因为它们使用相同的属性,但仍将它们映射到两个不同的表:活动用户和非活动用户 -strategy=InheritanceType

我使用SINGLE_TABLE继承startegy映射我的usres,请参见下面的代码示例

是否有一种方法可以将未激活的RegularUser和未激活的Business User从ACTIVE_USERS表映射到另一个表(例如,未激活的_USERS)并保持继承起始状态

注:

-这里的要点是避免前RegularUser和UnActiveRegularUser之间的代码重复,因为它们使用相同的属性,但仍将它们映射到两个不同的表:活动用户和非活动用户

-strategy=InheritanceType.SINGLE_表不应更改

-添加另一个抽象层可以解决这个问题吗

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "ACTIVE_USERS")
public class User {
    @Id @GeneratedValue
    protected Long id;

    @Column(nullable = false)
    protected String name;
}


@Entity
public class RegularUser extends User{
//more getters and settres
}

@Entity
public class UnActiveRegularUser extends User{
//same getters and setters as in RegularUser
}

@Entity
public class BusinessUser extends User {
//more getters and settres
}

@Entity
public class UnActiveBusinessUser extends User {
//same getters and setters as in BusinessUser
}
谢谢,
Nathan将字段持久化到另一个表不会防止代码重复。我认为你应该让非活动业务用户扩展业务用户,让非活动规则用户扩展常规用户


请注意,如果一个用户可以变成非活动用户,即它是一个常规用户并成为一个非活动规则用户,那么继承并不是正确的解决方案:一个对象不能从一种类型转换到另一种类型。由于UnactiveRegularUser似乎只有RegularUser,所以我不确定这个子类是否有用。

我将RegularUser和UnactiveRegularUser分为两个实体,因为据我所知,您无法将一个实体映射到两个不同的列。您建议的继承样式ex.UnActiveBusinessUser extend BusinessUser的问题是,它们仍将映射到@Tablename=ACTIVE\u用户……是否有办法将映射分开?我不太明白您想要什么。您希望将继承策略中的所有遗传映射到单个表,但也希望将实体映射到多个表。这是矛盾的。我想将RegularUser和BusinessUser映射到ACTIVE_用户,将UnActiveRegularUser和UnActiveBusinessUser映射到UNACTIVE_用户表。我使用继承来避免实体定义级别的代码重复,但问题是,所有实体仍然只映射到活动用户表……JPA不支持类层次结构中的混合继承策略。I no-enetiy与用户没有任何关联,只有与具体子类的关联,您应该将用户映射为MappedSuperclass,并具有两个以ActiveUser和InactiveUser为根的层次结构,这两个层次结构都扩展了使用单表继承映射的用户。