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

Java Hibernate每类继承表和单表混合,java,hibernate,single-table-inheritance,table-per-subclass,Java,Hibernate,Single Table Inheritance,Table Per Subclass,我正在开发网上商店,我需要Hibernate映射方面的帮助。我继承了以下遗产: BaseProduct / \ Guitar Drum / \ / \ AcGuitar ElGuitar AcDrum ElectricDrum 我想要的: 1) id、名称、描述等公共字段将位于@MappedSuperclass BaseProduct中 2) 乐器类型(吉他、鼓)将具有这些类

我正在开发网上商店,我需要Hibernate映射方面的帮助。我继承了以下遗产:

         BaseProduct
         /         \
     Guitar         Drum
     /    \         /    \
AcGuitar   ElGuitar AcDrum ElectricDrum
我想要的:
1) id、名称、描述等公共字段将位于@MappedSuperclass BaseProduct中
2) 乐器类型(吉他、鼓)将具有这些类型乐器的公共字段。
3) 最后,混凝土类AVGUITAT、ELGUITAT等将具有这种混凝土乐器的独特属性。

最大的问题是,我希望两种类型的乐器有两个表:吉他和鼓(继承类型。每个类有一个表),具体类有一个表继承类型。单表,这意味着将有一个表用于原声吉他和电吉他,一个表用于原声鼓和电鼓,并带有相应的判别列

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

更新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 {
}

因此,不幸的是,使用这种解决方案,任何混合都无法工作。

您可以像

    @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,i。E吉他和鼓

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

}

现在,yr db中有三个表格。请查看以供参考

Prateek Singh,非常感谢您的帮助,但您的解决方案不允许我将产品映射到其他实体。我希望有一个基类(BaseProduct),并将其映射到用户实体等@vmolchanov此解决方案完全实现了您在问题中描述的内容。如果您还有一些要求,请将其添加到问题中。另外,我不知道你所说的“将产品映射到其他实体”是什么意思:请在你的问题中提供一个例子。提出这个问题。我目前正在寻找解决同样问题的方法。Hibernate似乎在默默地忽略单表注释,并查找名为AC_吉他、EL_吉他、AC_鼓或ELECTRIC_鼓的表(在您的示例中)。有没有下过结论?(为什么不可能也是一个很好的帮助)