【问题标题】:Inheritance mapping in HibernateHibernate 中的继承映射
【发布时间】:2012-01-24 10:25:17
【问题描述】:

我有两组表,继承如下:

Print
|
+-Magazine -+- ScientificMagazine
|           |
|           +- PopularMagazine
|
+-Book -+- EncyclopediaBook 
        |
        +- ReligiousBook 

以及对应的语言环境层次结构:

PrintLocale
|
+-MagazineLocale -+- ScientificMagazineLocale
|                 |
|                 +- PopularMagazineLocale
|
+-BookLocale -+- EncyclopediaBookLocale
              |
              +- ReligiousBookLocale

我正在尝试将 Prints 的类映射到相应的语言环境。

请注意,Locale 类是 {en, de, fr, es, cs} 的枚举 - 语言的缩写。

所以在 Print 类中,我有一个 EnumMap 来将相应的语言环境映射到 Print:

public class Print<T> {
    ...
    @ElementCollection
    @JoinTable (joinColumns = @JoinColumn (name="print_id"))
    @MapKeyColumn (name="locale")
    protected Map<Locale, T> locales = new EnumMap<Locale.class>();
    ...

我的问题是:

  1. 当我尝试映射继承的类(例如映射 ScientificMagazineLocale,它从其父类继承变量到 ScientificMagazine)时,我得到了 ArrayOutOfBoundException。如果我将 PrintLocale、MagazineLocale 的所有内容复制到 ScientificMagazineLocale 并删除继承,一切正常。

  2. 由于 PrintLocale 映射到 Print 类中,因此休眠总是尝试生成“print_locales”表而不是相应的表(popular_magazine_locale、science_magazine_locale、...),即使在 PopularMagazineLocale 中我定义了 @Table(name= “popular_magazine_locale”)。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    对于您的第一个问题: @JoinTable(joinColumns = {@JoinColumn(name="print_id")})

    试试看。

    我的猜测是 Hibernate 期望“joinColumns”是一个数组。这就是为什么您需要添加这些 { } 括号。

    至于你的第二个问题, JPA 2.0 声明 @Inheritance 的默认值为 InheritanceType.SINGLE_TABLE。如果没有提供 @Inheritance 注释,则使用它。 结果 - 所有内容都映射到 1 个表。

    【讨论】:

      【解决方案2】:

      解决方案是对父抽象类使用@MappedSuperClass。

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 2011-11-22
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多