У меня есть следующий класс сущностей JPA. И еще один объект OptProject, который расширяет Project. Я использую InheritanceType.JOINED
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
private Long id;
@Basic
@Column(name = "NAME", nullable = false, length = 150)
private String name;
@Basic
@Column(name = "DESCRIPTION", nullable = false, length = 500)
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
@Entity
@Table( name = "opt_project")
public class OptProject extends Project {
@OneToMany(mappedBy = "project", cascade = {CascadeType.ALL})
private List<Case> cases = new ArrayList<>();
public OptProject() {}
public OptProject(String name, String description) {
super(name, description);
}
}
Репозиторий JPA для сущности OptProject выглядит следующим образом:
@Repository
public interface OptProjectRepository extends CrudRepository<OptProject, Long> {
}
Когда я создаю OptProject и пытаюсь сохранить его, я получаю сообщение об ошибкениже. Это не имеет никакого смысла для меня, поскольку я использую @GeneratedValue (стратегии = GenerationType.IDENTITY) для сервера SQL для генерации первичного ключа идентификатора.
OptProject optProject = new OptProject("name", "description");
OptProject savedProject = optProjectRepo.save(optProject);
com.microsoft.sqlserver.jdbc.SQLServerException: Cannotвставьте явное значение для столбца идентификаторов в таблицу 'optim_project', когда для IDENTITY_INSERT задано значение OFF.
После включения режима ведения журнала гибернации для отладки со следующими фрагментами
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace
Это журналы SQL режима гибернации:
DEBUG org.hibernate.SQL - insert into dbo.project (name, description) values (?, ?)
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [name]
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - [description]
DEBUG org.hibernate.SQL - insert into opt_project (id) values (?)
TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - [11]
WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 544, SQLState: S0001
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Cannot insert explicit value for identity column in table 'opt_project' when IDENTITY_INSERT is set to OFF.
Первый оператор SQL для вставки данных в таблицу для базового класса Project правильный. Но оператор SQL для вставки данных во вторую таблицу для дочернего класса OptProject является проблемой. Он вручную добавляет идентификатор со значением 11 и не позволяет БД сгенерировать его, возможно, потому что здесь есть только поле идентификатора. Я не уверен, что здесь происходит.