Таблица наследования Hibernate для каждого класса и отдельная таблица

Я занимаюсь разработкой интернет-магазина, и мне нужна помощь с отображением Hibernate. У меня есть следующее наследство:

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

Что я хочу:
1) Общие поля, такие как идентификатор, имя, описание будут в @MappedSuperclass BaseProduct.
2) Типы музыкальных инструментов (Guitar, Drum) будут иметь общие поля для этих типов инструментов.
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 ответа

Вы можете сделать это что-то вроде...

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

     }

в результате вы получите два стола в вашей базе данных, то есть гитару и барабан

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

}

Теперь в вашей базе данных будет три таблицы. Для ознакомления. Вот

Другие вопросы по тегам