【发布时间】:2020-02-21 22:08:27
【问题描述】:
我有以下 JPA 实体类。还有另一个扩展 Project 的实体 OptProject。我正在使用 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);
}
}
OptProject 实体的 JPA 存储库如下
@Repository
public interface OptProjectRepository extends CrudRepository<OptProject, Long> {
}
当我创建一个 OptProject 并尝试保存它时,我收到以下错误消息。这对我来说是零意义,因为我使用 @GeneratedValue(strategy = GenerationType.IDENTITY) 为 SQL 服务器生成 ID 主键。
OptProject optProject = new OptProject("name", "description");
OptProject savedProject = optProjectRepo.save(optProject);
com.microsoft.sqlserver.jdbc.SQLServerException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“optimization_project”中插入标识列的显式值。
使用以下 sn-ps 将 hibernate 日志记录转为调试后
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.
将数据插入到基类 Project 表中的第一条 SQL 语句是正确的。但是将数据插入到子类 OptProject 的第二个表的 SQL 语句是问题所在。它是手动添加值为 11 的 ID,而不是让 db 生成它,可能是因为这里只有 ID 字段。我不确定这里发生了什么。
【问题讨论】:
-
@EduardoEljaiek,它不是重复的,因为 ID 生成器策略是 GenerationType.IDENTITY。这意味着我没有为 ID 传递显式值,并且 db 应该在执行插入时为我生成一个。
标签: java jpa spring-data-jpa