【问题标题】:Hibernate inheritance table per class and single table mix每个类和单表混合的 Hibernate 继承表
【发布时间】:2014-10-05 18:24:13
【问题描述】:

我正在开发在线网上商店,我需要有关 Hibernate 映射的帮助。我有以下继承:

         BaseProduct
         /         \
     Guitar         Drum
     /    \         /    \
AcGuitar   ElGuitar AcDrum ElectricDrum

我想要什么:
1) id、name、description 等常用字段会在@MappedSuperclass BaseProduct 中。
2)乐器类型(吉他、鼓)对于这些类型的乐器会有共同的字段。
3)最后,具体类 AvGuitar、ElGuitar 等将具有此具体乐器的独特属性。

最大的问题是我希望有两个表用于两种 types 乐器:t_guitar 和 t_drum (InheritanceType.TABLE_PER_CLASS),对于具体类,一个表 InheritanceType.SINGLE_TABLE,这意味着将有一张用于原声和电吉他的表格,一张用于原声和电鼓的表格,并带有相应的判别列。

我怎样才能做到这一点?谢谢!

更新 1

由于我需要将整个层次结构作为一种通用类型进行交互并将产品映射到另一个实体,因此我执行了以下操作:

@MappedSuperclass
public abstract class BaseProduct { //supercclass 

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    private String title;
    // etc
}

中级产品:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Product extends BaseProduct {
}

因此,不幸的是,使用这种解决方案,任何混合仍然不起作用。

【问题讨论】:

  • 提升这个问题。我目前正在寻找解决同样问题的方法。似乎 Hibernate 默默地忽略了 SINGLE_TABLE 注释并查找名为 AC_GUITAR、EL_GUITAR、AC_DRUM 或 ELECTRIC_DRUM 的表(在您的情况下)。曾经设法得出结论吗? (为什么不可能也是一个很好的帮助)

标签: java hibernate single-table-inheritance table-per-subclass


【解决方案1】:

你可以这样做......

    @MappedSuperclass
    public class base { 
    @Id
    private  String id;   //yr field

    }


    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(
    name="classname",
    discriminatorType=DiscriminatorType.STRING
    )
    public class drum  extends base{

   String drumProperties;  //yr drum prop.

    }

    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(
    name="classname",
    discriminatorType=DiscriminatorType.STRING
    )
    public class guitar extends base {

    private String guitarProperties;    //guitar prop.
    }


    @Entity
    public class AcGuitar extends guitar{
    String acGuitarprop;

    }

   @Entity
   public class ElGuitar extends guitar{
   String elGuitarprop;

   }

    @Entity
   public class ElDrum extends drum{
   String elDrumprop;

   }

    @Entity

    public class AcDrum extends drum{
   String acDrumprop;

     }

根据结果,您将在 yr DB 中获得两个表,即。 e.吉他和鼓

【讨论】:

  • Prateek Singh,非常感谢您的帮助,但您的解决方案不允许我将产品映射到其他实体。我想要一个基类(BaseProduct),并将其映射到用户实体等。
  • @vmolchanov 这个解决方案完全实现了您在问题中描述的内容。如果您有更多要求,请将它们添加到问题中。我也不知道您所说的“将产品映射到其他实体”是什么意思:请在您的问题中提供一个示例。
【解决方案2】:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class base { 
@Id
private  String id;   //yr field

}

现在 yr db 中将有三个表。供您参考检查。 here

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2015-10-09
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多