Hibernate/JPA多级继承

4

我在定义多层继承的架构时遇到问题,我的情况如下:

Model(id,created)

UserModel扩展Model(login,password)

CustomerModel扩展UserModel(orders)

StoreOwnerModel扩展UserModel(stores)

ProductModel扩展Model(name,price)

我在Model中设置了继承策略为TABLE_PER_CLASS,这意味着我希望为Model的每个子类创建一个表。

而在UserModel中,继承策略设置为SINGLE_TABLE,以便所有UserModel的子类只有一个表。

但是在我的数据库中,我发现为每个UserModel的子类生成了一个表。

在生成的USERS表中,我找不到对应于UserModelDiscriminatorColumn user_type

以下是我的实体:

Model.class

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@MappedSuperclass
public abstract class Model {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer id;

    @DateTimeFormat(pattern="dd/MM/yyyy hh:mm:ss")
    private Date created;

    //getters/setters
}

UserModel.class

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type",discriminatorType=DiscriminatorType.STRING)
@SecondaryTable(name="USERS")
@DiscriminatorValue("user")
public class UserModel extends Model{


    @Column(unique=true)
    private String login;
    //getters & setters
}

CustomerModel.class

@Entity
@DiscriminatorValue(value="customer")
public class CustomerModel extends UserModel{

    private List<OrderModel> orders;

    //getters & setters

}

StoreOwnerModel.class

@Entity
@DiscriminatorValue(value="store_owner")
public class StoreOwnerModel extends UserModel{

    private List<StoreModel> stores;

    //getters & setters

}

ProductModel.class

@Entity
public class StoreOwnerModel extends UserModel{

    private String name;
    private double price;
    //getters & setters

}

PS:这不是重复的问题,我在之前的任何问题中都没有找到答案。


4
模型不是一个实体,它是一个映射的父类,不应该有继承策略- 扩展它的每个实体都将成为自己独立的实体,只共享映射属性,而不是表格。 尝试删除继承标记,因为它可能会导致您的提供程序出现问题。 您可以通过将其设置为单表继承来验证此操作- 模型仍不会有表格创建。 - Chris
@Chris 谢谢老兄,现在它完美运作了。 - Mohamed Nabli
1个回答

2

根据 @chris 的建议,我应该从 Model 实体中删除 @Inheritance,并且我还从 UserModel 中删除了 @SecondaryTable(name="USERS"),这样它就完美地工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接