Невозможно сохранить сущность с помощью Spring JPA с InhertanceType.JOINED - PullRequest
1 голос
/ 25 октября 2019

У меня есть следующий класс сущностей 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 и не позволяет БД сгенерировать его, возможно, потому что здесь есть только поле идентификатора. Я не уверен, что здесь происходит.

1 Ответ

1 голос
/ 25 октября 2019

Это ручное добавление идентификатора со значением 11 и не позволяющий БД генерировать его, возможно, потому что здесь есть только поле идентификатора. Я не уверен, что здесь происходит.

Вы используете тип объединенного наследования. Зависимый объект должен иметь тот же PK, что и родительский элемент, в противном случае как именно они будут объединены ? Единственный способ, который произойдет, - это если значение идентификатора для зависимой сущности устанавливается вручную при вставке. Поэтому вам необходимо изменить определение столбца в таблице opt_project, чтобы оно было , а не столбцом Identity.

...