Я мог бы создать таблицу ApprovalItem для каждого типа объекта (например, A_ApprovalItem, B_ApprovalItem и т. Д.). Это похоже на хорошую схему на стороне базы данных
Но
Кажется, мне нужно создать отдельные классы домена в Java для каждого утверждения сущности (например, класс AAprrovalItem, класс BApprovalItem и т. Д.).
Тебе это не нужно. Вы можете создать один класс ApprovalItem и создать связь @OneToMany между родительскими классами и ApprovalItem. Hibernate заботится о создании связанной таблицы для каждого отношения.
@Entity
public class ClassA {
@Id
@GeneratedValue
private Integer id;
// Hibernate will create CLASSA_APPROVALITEM to link both class
@OneToMany
private List<ApprovalItem> approvalItemList;
}
@Entity
public class ClassB {
@Id
@GeneratedValue
private Integer id;
// Hibernate will create CLASSB_APPROVALITEM to link both class
@OneToMany
private List<ApprovalItem> approvalItemList;
}
И ваш класс ApprovalItem
@Entity
public class ApprovalItem {
@Id
@GeneratedValue
private Integer id;
// Nothing else
}
Но давайте посмотрим, что говорит об этом Java Persistence с книгой Hibernate
У вас может быть общих ссылок на объекты Bid. Как предлагалось ранее, пользователь может иметь коллекцию ссылок на сделанные им экземпляры заявок. Вы не можете удалить элемент и все его ставки без предварительного удаления этих ссылок. Вы можете получить исключение, если попытаетесь зафиксировать эту транзакцию, , поскольку может быть нарушено ограничение внешнего ключа .
Так что имейте это в виду при работе с общими ссылками.
Чтобы увидеть, как выглядит целевая схема, вы можете использовать следующее
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration
.addAnnotatedClass(ClassA.class)
.addAnnotatedClass(ClassB.class)
.addAnnotatedClass(ApprovalItem.class)
.setProperty(Environment.USER, <TYPE_YOUR_USER>)
.setProperty(Environment.PASS, <TYPE_YOUR_PASSWORD>)
.setProperty(Environment.URL, <TYPE_YOUR_URL>)
.setProperty(Environment.DIALECT, <TYPE_YOUR_DIALECT>)
.setProperty(Environment.DRIVER, <TYPE_YOUR_DRIVER>);
SchemaExport schema = new SchemaExport(configuration);
schema.setOutputFile("schema.sql");
schema.create(<DO_YOU_WANT_TO_PRINT_TO_THE_CONSOLE>, <DO_YOU_WANT_TO_EXPORT_THE_SCRIPT_TO_THE_DATABASE>);
Будет сгенерирован файл с именем schema.sql, содержащий вашу целевую схему
С уважением,