【问题标题】:Hibernate : strategy=GenerationType value for oracle休眠:oracle 的策略=GenerationType 值
【发布时间】:2014-07-11 08:11:42
【问题描述】:

我的实体类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="APP_INSTANCE")
public class ApplicationEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="INSTANCE_KEY")
    private int INSTANCE_KEY;
 //other code 
}

我的表结构:

CREATE TABLE "APP_INSTANCE" 
("INSTANCE_KEY" NUMBER NOT NULL ENABLE, 
"SYS_ID" VARCHAR2(255) , 
"NAME" VARCHAR2(255) , 
"ENV" VARCHAR2(50) , 
PRIMARY KEY ("APP_INSTANCE_KEY") ENABLE
 ) 

我正在使用 Spring 3、Hibernate 4 和 oracle 数据库。运行我的应用程序时,我遇到以下错误:

03:23:07,380 INFO  [STDOUT] Hibernate: insert into USER.APP_INSTANCE (SYS_ID, NAME, ENV) values (?, ?, ?)
03:23:08,271 INFO  [STDOUT] WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1400, SQLState: 23000
03:23:08,271 INFO  [STDOUT] ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-01400: cannot insert NULL into ("USER"."APP_INSTANCE"."INSTANCE_KEY")
03:23:08,271 INFO  [STDOUT] Exception in saving..
03:23:08,271 ERROR [STDERR] org.hibernate.exception.ConstraintViolationException: could not execute statement
03:23:08,271 ERROR [STDERR]     at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
03:23:08,271 ERROR [STDERR]     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
03:23:08,271 ERROR [STDERR]     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:124)

我也试过GenerationType.AUTO,但后来我得到了类似sequence not found的东西。

请帮忙。我知道这个问题与@GeneratedValue 有关。请让我知道上表和 oracle 数据库的值。

【问题讨论】:

  • 据我记得,Oracle 使用序列,所以你需要GenerationType.SEQUENCE
  • @Atha :所以我只需要在我的实体类中将 GenerationType.IDENTITY 替换为 GenerationType.SEQUENCE。Right.DO 我还需要在数据库端做任何事情(比如需要创建任何序列等) ?

标签: java sql spring hibernate


【解决方案1】:

你可以使用GenericGenerator类的hibernate。

@Id
@GenericGenerator(name = "increment", strategy = "increment")
@GeneratedValue(generator = "increment")
private int INSTANCE_KEY;

【讨论】:

    【解决方案2】:

    在oracle数据库中创建序列:

    CREATE SEQUENCE SEQ_APP_INSTANCE
     START WITH     1
     INCREMENT BY   1
     NOCACHE
     NOCYCLE;
    

    并注释 id 以使用此序列:

    @GeneratedValue(generator="seq_item", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name="seq_item",sequenceName="SEQ_APP_INSTANCE", allocationSize=10)
    @Column(name="INSTANCE_KEY")
    private int INSTANCE_KEY;
    

    【讨论】:

      【解决方案3】:

      在您的 INSTANCE_KEY 字段上设置:

      @Id
      @Column(name="INSTANCE_KEY")
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqInstanceKey")
      @SequenceGenerator(name = "seqInstanceKey", sequenceName = "SEQ_INSTANCE_KEY", allocationSize = 1)
      private int INSTANCE_KEY;
      

      然后在您的数据库中添加一个名为“SEQ_INSTANCE_KEY”的序列,其属性增量 = '1'

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2015-10-31
        • 2020-01-30
        • 2020-10-05
        相关资源
        最近更新 更多