【问题标题】:JPA with ORACLE insert null error带有 ORACLE 的 JPA 插入空错误
【发布时间】:2014-12-01 12:01:06
【问题描述】:

我有一个名为“Service”的 JPA 实体,其 ID 作为主键

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "NAME")
private String name;

当我尝试通过 JPA 持久性 API 持久化这些数据时

Service service = new Service("abcservice");    
entityManager.persist(service);

我遇到错误

cannot insert NULL into ("TESTUSER992"."SERVICE"."ID")
org.hibernate.exception.ConstraintViolationException: could not insert: [com.dto.Service]

我正在使用 Oracle Thin,sid:xe

【问题讨论】:

标签: java oracle exception jpa constraints


【解决方案1】:

Oracle 不支持自动生成的列,如 MySQL 或 Postgres。您将不得不使用序列或表格来生成 ID,或者在您的代码中手动设置一个。

序列示例:

@Id 
@GeneratedValue(generator="ServiceIdSeq", strategy=GenerationType.SEQUENCE) 
@SequenceGenerator(name="ServiceIdSeq", sequenceName="SERVICE_ID_SEQ")
private long id;

表格示例:

@Id 
@GeneratedValue(generator="ServiceIdTab", strategy=GenerationType.TABLE) 
@TableGenerator(name="ServiceIdTab", table="SEQUENCE_ID_GEN", 
    pkColumnName="ID_NAME", valueColumnName="ID_VAL", 
    pkColumnValue="SERVICE_GEN")
private long id;

更新

在你的数据库中执行这个来创建序列:

CREATE SEQUENCE SERVICE_ID_SEQ INCREMENT BY 1;

【讨论】:

  • 我尝试了这两种方法,但出现错误。错误:org.hibernate.exception.SQLGrammarException:无法获取下一个序列值
  • @ImranTariq 您需要在数据库中创建一个序列才能使其工作。检查我更新的答案。它将创建一个在第一个示例中配置的序列。
  • 使用序列和表格后再次出现同样的错误。
  • 无需使用@TableGenerator 进行尝试,create sequence 代码仅用于@SequenceGenerator 示例。异常堆栈跟踪中有更多详细信息吗? Caused by: Sequence does not exist 或类似的东西?
  • 'javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException:' 无法获取下一个序列值
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 2023-03-29
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多