Я пытаюсь сохранить сущность с составным первичным ключом, один из которых должен быть автоматически увеличен, используя Spring Boot 2.1.2.RELEASE + JPA (используя стартеры) и MySQL (InnoDB).У меня есть абстрактный класс с 2 неабстрактными подклассами, и я использую стратегию единой таблицы для наследования.
Я искал, как это сделать, но каждый пост, который, кажется, ищетто же самое, что и я, заканчивается без ответа ( пример ).
Моя текущая настройка выглядит так (сеттеры, геттеры и конструкторы опущены для ясности).
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@IdClass(MyEntityPK.class)
public abstract class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long pk1; //Should be auto-incremented
@Id
OffsetDateTime pk2;
//More fields...
public class MyEntityPK implements Serializable {
private static final long serialVersionUID = 1L;
long pk1;
OffsetDateTime pk2;
}
@Repository
public interface MyEntityRepository extends CrudRepository<MyEntity, MyEntityPK> {
//Some methods like save().
}
Первая проблема, которую я обнаружил, была с генерацией таблицы.MySQL позволяет создавать PK, если он объявлен как
PRIMARY KEY (pk1, pk2)
, но не в другом порядке
PRIMARY KEY (pk2, pk1)
При создании таблицы Hibernate использует вторую, что приводит к сбою.Также пытался изменить порядок полей, но безрезультатно.Я думаю, что это может быть проблемой с Hibernate, но я не уверен.Кто-нибудь может подтвердить?Во всяком случае, я решил это, создав сценарий DDL вручную и отключив автоматический DDL с помощью Hibernate.
Следующая проблема, для которой я не нашел ответа, заключалась в том, что сущности были правильно сохранены в таблице, ноid, возвращаемый методом сохранения репозитория, всегда был 0. Я вручную устанавливал pk2 перед сохранением, оставляя pk1 для завершения БД.
entity.setPk2(OffsetDateTime.now());
Entity savedEntity = repository.save(entity); //savedEntity has id 1 in table but 0 in code
Во время отладки я пришел к этому Метод isNew () .Оказывается, он возвращал false, потому что MyEntityPK отличался от null (я установил pk2).Это, конечно, не то, что я ожидал, так как я на самом деле сохраняю новую сущность, учитывая, что мой PK составной, и я оставил одно поле пустым.Итак, я также думаю, что это может быть ошибкой.Некоторые классы переопределяют метод isNew (), но кажется, что они не используются.
Я что-то не так делаю или это ошибка?Помощь оценена :) 1027 *