У меня проблемы с @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.