【问题标题】:JPA : Auto Increment ID with Oracle Database [duplicate]JPA:Oracle 数据库的自动增量 ID [重复]
【发布时间】:2018-01-22 01:20:09
【问题描述】:

我用 Generated Id 值定义了一个实体,但是当我尝试插入时,我得到了这个错误:

    10:33:32,202 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) SQL Error: 2289, SQLState: 42000
    10:33:32,203 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-8) ORA-02289: sequence does not exist
    10:33:32,205 ERROR [org.jboss.as.ejb3.invocation] (default task-8) WFLYEJB0034: EJB Invocation failed on component  javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist

实体:

@Entity
@Table(name = "TYPEDEM")
public class TypeDem {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private long id;
    @Column(name = "CODE")
    private String code;
    @Column(name = "LABEL")
  ..
}

类:

@Override
    public TypeDem save(TypeDem typeDem) {
        entityManager.persist(typeDem);
        return typeOfDemand;
    }

在debug中看到id的值为null

【问题讨论】:

  • 不,Oracle 没有“自动增量”支持,所以不,你不能使用 IDENTITY 策略。但是,我希望您的 JPA 提供者会告诉您这一点,而不仅仅是使用 NULL!也许你应该提出一个错误。
  • 你想用来生成id的序列是什么。它是在您的数据库架构中创建的

标签: java jpa


【解决方案1】:

你的解决方案是正确的。

唯一的问题似乎是 hibernate.hbm2ddl.auto 没有设置为更新,请使用更新。使用 create 或 create-drop 时要非常小心。

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist

这清楚地表明数据库中缺少该序列。

【讨论】:

  • 他的“解决方案”不正确。他选择了身份策略。 IDENTITY 表示一个“身份列”……用 RDBMS 的说法,这是 AUTO_INCREMENT 或 SERIAL 列类型。 Oracle 没有这样的支持。 JPA 规范还说“IDENTITY 不能在所有数据存储中移植”。如果他想使用序列,他应该选择 SEQUENCE 策略
【解决方案2】:

身份生成器

在 Sybase、My SQL、MS SQL Server、DB2 和 HypersonicSQL 中用于支持 id 列。返回的 id 类型为 short、int 或 long。

IDENTITY 类型(包括在 SQL:2003 标准中)受以下支持:

SQL 服务器 MySQL (AUTO_INCREMENT) DB2 数据库 IDENTITY 生成器允许根据需要自动增加整数/大整数列。递增过程发生在当前正在运行的事务之外,因此回滚可能最终会丢弃已分配的值(可能发生值间隙)。

对于 Oracle,使用以下代码 @GeneratedValue(strategy=GenerationType.AUTO)

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID")

【讨论】:

  • Thx ,但是当我使用 AUTO 时,我得到了同样的错误
猜你喜欢
  • 2012-03-10
  • 2014-11-18
  • 2020-06-17
  • 2011-03-02
  • 2019-09-02
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多