Hibernate继承表每个类和单个表混合

时间:2014-10-05 18:24:13

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

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

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

我想要的是什么:
1)id,name,description等常用字段将在@MappedSuperclass BaseProduct中。
2)乐器类型(吉他,鼓)将为这些类型的乐器提供共同的字段。
3)最后,AvGuitar,ElGuitar等具体课程将具有这种混凝土乐器的独特属性。

最大的问题是我希望两个类型的工具有两个表: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 {
}

所以,有了这个解决方案,遗憾的是任何混音都不起作用。

2 个答案:

答案 0 :(得分:0)

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

    @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;

     }

结果你会在你的DB中得到两个表,i。即吉他和鼓

答案 1 :(得分:0)

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class base { 
@Id
private  String id;   //yr field

}

现在在你的数据库中会有三个表。供你参考检查。 here