【问题标题】:Setting up Oracle Primary Key automatically using sequences使用序列自动设置 Oracle 主键
【发布时间】:2016-06-06 13:52:52
【问题描述】:

对于上下文,我正在处理一个项目,我希望我的 oracle 数据库中的主 ID 是从 oracle 序列自动生成的。我正在使用 Java Server Faces 和 Hibernate 将项目添加到数据库中。

下面是相关的代码部分:

创建序列语句

    CREATE SEQUENCE  "BIM***********"."SEQUENCE1"  MINVALUE 1 MAXVALUE     
    9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20  
    NOORDER NOCYCLE ;

创建表语句

  CREATE TABLE "BIMB2013WMMEE"."CLIENT" 
   (    "CLIENT_ID" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    "CLIENT_CODE" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    "CLIENT_NAME" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
     CONSTRAINT "CLIENT_PK" PRIMARY KEY ("CLIENT_ID")
     USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
     STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
     PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
     BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
     TABLESPACE "USERS"  ENABLE
     ) SEGMENT CREATION IMMEDIATE 
     PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
     STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
     PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
     BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
     TABLESPACE "USERS" ;

     CREATE OR REPLACE TRIGGER "BIMB2013WMMEE"."BEFORE" 
     before insert on "BIMB2013WMMEE"."CLIENT" 
     for each row 
        begin  
          if inserting then 
           if :NEW."CLIENT_ID" is null then 
              select SEQUENCE1.nextval into :NEW."CLIENT_ID" from dual; 
           end if; 
          end if; 
         end;

        /
         ALTER TRIGGER "BIMB2013WMMEE"."BEFORE" ENABLE;

这是有问题的 Java 代码(据我所知)

@Entity
@Table (name="client")
public class Client {

    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="CLIENT_ID")
    private String id;

这是来自 Eclipse 的错误消息:

Hibernate: select hibernate_sequence.nextval from dual
Jun 06, 2016 9:19:06 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper     
logExceptions
WARN: SQL Error: 2289, SQLState: 42000
Jun 06, 2016 9:19:06 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper    
logExceptions
ERROR: ORA-02289: sequence does not exist

Jun 06, 2016 9:19:06 AM    
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool     [jdbc:oracle:thin:@endeavour.us.manh.com:1523/pso11r2f]
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist

【问题讨论】:

  • 也许您的序列没有同义词,您应该在select my_schema.SEQUENCE1.nextval 中定义您的架构?

标签: java sql oracle hibernate


【解决方案1】:

在实体上使用@SequenceGenerator注解,并在@GeneratedValue注解中用序列生成器名称指定generator属性,如下所示:

@Entity
@Table (name="client")
@SequenceGenerator(name="sequence1",sequenceName="BIM***********.SEQUENCE1",
allocationSize=1, initialValue=1)
public class Client {

    //Fields
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence1")
    @Column(name="CLIENT_ID")
    private String id;

【讨论】:

  • 当 Hibernate 使用这个解决方案分配一个 id 时,您的触发器可能没有用,除非您通过不同的应用程序创建客户端。
  • @JMSilla 对我的后续问题有任何想法:stackoverflow.com/questions/37663751/…
【解决方案2】:

尝试使用@SequenceGenerator + @GeneratedValue 注释。

@Id
@SequenceGenerator(name="sequence1",sequenceName="BIM***********.SEQUENCE1")
@GeneratedValue(generator="sequence1")
@Column(name="CLIENT_ID")
private String id;

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多