【问题标题】:Hibernate Inheritance Single_tableHibernate 继承 Single_table
【发布时间】:2012-12-31 13:56:43
【问题描述】:

我已经设置了如下所示的课程。 Hibernate ddl 生成 2 个表 Admin 和 Customer。根据 SINGLE_TABLE 策略,我本来希望只有一个表。

@MappedSuperclass
public abstract class BaseUser{
...
}

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Admin extends BaseUser{
...
}


@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Customer extends BaseUser{
@OneToMany
private List<Order> orders;
...
}

【问题讨论】:

    标签: hibernate inheritance


    【解决方案1】:

    不,单表继承的工作方式不同。继承策略需要在超类上定义。参考JPA Wikibook

    @Entity
    @Inheritance
    @DiscriminatorColumn(name="USER_TYPE")
    @Table(name="USER")
    public abstract class BaseUser{
    ...
    }
    
    @Entity
    @DiscriminatorValue("A")
    public class Admin extends BaseUser{
    ...
    }
    
    @Entity
    @DiscriminatorValue("C")
    public class Customer extends BaseUser{
    @OneToMany
    private List<Order> orders;
    ...
    }
    

    请注意,根据您的数据库,您可能会也可能不会被允许调用您的表USER。还有一个example for how to use @MappedSuperclass

    【讨论】:

    • 我不认为这是真的……子类应该继承继承策略。无论如何,这也不起作用。
    【解决方案2】:

    尽管不确定为什么 @MappedSuperclass 不起作用,这似乎仍然有效。

    @Entity
    @Inheritance
    public abstract class BaseUser{
    ...
    }
    
    @Entity
    public class Admin extends BaseUser{
    ...
    }
    
    
    @Entity
    public class Customer extends BaseUser{
    @OneToMany
    private List<Order> orders;
    ...
    }
    

    【讨论】:

    • 我告诉过你...它与我发布的内容基本相同(省略了默认配置)。阅读我发布的关于@MappedSuperclass 的链接。它与您所追求的完全相反 - 每个子类都有一个单独的表(每个表都有超类字段的列)。
    • 不,不是。我试过你的建议。即使我在超类上定义它,我也无法使用 @MappedSuperclass 使其工作。
    • 那一定是个误会。您问题中的代码使用了@MappedSuperclass,这是错误的。我的回答使用@Inheritance(而不是@MappedSuperclass)来生产你需要的东西。我对@MappedSuperclass 的回答中的参考用于解释如何使用它以及为什么它不适合您的场景。
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多