Проблема @Inheritance (стратегии = InheritanceType.TABLE_PER_CLASS) с @Id и последовательностью - PullRequest
1 голос
/ 07 марта 2020

У меня проблемы с @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) и автоматически сгенерированными идентификаторами таблиц.

Вот моя модель:

@Getter
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "type")
@SuperBuilder
@NoArgsConstructor
public abstract class MenuEntity {

    @Id
    @EqualsAndHashCode.Include
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    //...
}
@Getter
@Entity
@Table(name = "tasting_menu")
@SuperBuilder
@NoArgsConstructor
public class TastingMenuEntity extends MenuEntity {

    //...
}
@Getter
@Setter
@Entity
@Table(name = "simple_menu")
@SuperBuilder
@NoArgsConstructor
public class SimpleMenuEntity extends MenuEntity {

    //...
}

В процессе разработки я определил data.sql скрипты, которые вставляют тестовые данные в мою базу данных H2. Эти сценарии будут нормально работать , только если Я укажу значение ID в выражении, в противном случае я получу NULL not allowed for column "ID". Таким образом, я должен установить ID в операторе вставки (проблема не возникает в других объектах без стратегии наследования и @GeneratedValue(strategy = GenerationType.IDENTITY)).

Возникает новая проблема: когда приложение пытается вставить SimpleMenuEntity во время выполнения, выдается исключение: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.SIMPLE_MENU(ID), поскольку sequence все еще имеет значение 1, даже если оно уже имеет некоторые тестовые данные .

У меня пока есть несколько вопросов.

1. Моя модель верна?

Я должен использовать @Entity вместо @MappedSuperclass в моем abstract class, потому что он имеет @ManyToOne аннотацию. Свойство

ID является общим для всех дочерних таблиц, но хотелось бы, чтобы каждая таблица имела свою собственную последовательность id.

2. Как мне обращаться с автоматически сгенерированными ID для SQL INSERT операторов?

Мне обязательно нужны тестовые данные в моем приложении для разработки porpouse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...