当前位置: 首页 > 知识库问答 >
问题:

无法持久化带有InhertanceType.Jointed的Spring JPA实体

徐博雅
2023-03-14

我有以下JPA实体类。和扩展Project的另一个实体OptProject。我正在使用InheritanceType.Jointed

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(Streaty=GenerationType.Identity)为SQL server生成ID主键。

    OptProject optProject = new OptProject("name", "description");
    OptProject savedProject = optProjectRepo.save(optProject);

com.microsoft.sqlserver.jdbc.sqlserverexception:当IDENTITY_INSERT设置为off时,无法为表'optimization_project'中的identity列插入显式值。

logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

以下是hibernate 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语句是正确的。但是将数据插入子类OptProject的第二个表的SQL语句是问题所在。它手动添加值为11的ID,而不让db生成它,这可能是因为这里只有一个字段(ID)。我不确定这是怎么回事。

共有1个答案

马承
2023-03-14

它手动添加值为11的ID,而不让db生成它,这可能是因为这里只有一个字段(ID)。我不确定这是怎么回事。

您使用的是联接继承类型。依赖实体必须与父实体具有相同的PK,否则它们将如何连接?发生这种情况的唯一方式是在插入时手动设置依赖实体的ID值。因此,您需要更改opt_project表中的列定义,使其不是标识列。

 类似资料:
  • 我已经在这个问题上工作了两天了,现在我没有主意了。 下面是entity和dao类: 抽象性: 域道: 我不认为问题出在EntityManager或dao类中,因为EntityManager(find())至少有一个方法起作用。我会很感激和帮忙的。

  • 我是Spring靴的初学者,不能解决问题。我有一个实体类(Customer)和一个REST存储库(CustomerRepository)。类包含一些我不想被REST存储库公开的敏感字段。因此,我使用@jsonIgnore注释对这些字段进行了注释,如下所示: 一切正常,我的REST API返回了所需的结果。但是,当我向API发出POST请求以插入新实体时,我会收到数据库错误:。 在POST请求中,密

  • 对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新

  • 我正在尝试使用来持久化一个实体。当我自己处理事务时,我的测试用例工作(数据保存在db中)。 (实体管理器来自我的DAO类扩展的模板类) 当我配置spring来处理事务时,它会停止分发数据。 测试上下文。xml: UsersRepositoryTest: 堆栈跟踪: 从stacktrace中可以看到,事务似乎已经启动和完成,但没有生成sql插入,也没有数据插入到数据库中(数据回滚设置为false)

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重

  • 我试图集成Spring和JSF,我坚持使用对象。我不想处理事务(begin-commit等) 经过一些谷歌,我可以找到一个答案,给我需要在这个链接 我使用eclipselink作为ORM和Oracle 11g数据库,并使用带有Maven的Glassfish Server3.1。我更喜欢Spring配置的注释。我用 相关类中的注释。我的名称是E_DefterManagementPU,我的事务类型是J