Таблица наследования 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
}
Теперь в вашей базе данных будет три таблицы. Для ознакомления. Вот