我在用EJB向Oracle数据库中插入值的时候(PM规定不能在建表的时候写序列和触发器),规定了表中id必须自增长,还要在程序中实现,因此想到了在Entity类中加入:
          @Id       
@GeneratedValue(strategy=GenerationType.AUTO)   
@Column(name="EMP_ID")
private String empId;但是在测试的时候就报出了异常,如下:
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-00942: 表或视图不存在
 {prepstmnt 1271286726 SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE [params=?]} [code=942, state=42000]
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:215)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:895)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.executeQuery(TableJDBCSeq.java:774)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.getSequence(TableJDBCSeq.java:514)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.setSequence(TableJDBCSeq.java:554)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq$AllocateSequenceRunnable.run(TableJDBCSeq.java:824)
at org.apache.openjpa.ee.WASRegistryManagedRuntime$DelegatingUOWAction.run(WASRegistryManagedRuntime.java:71)
at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:1067)
at com.ibm.ws.uow.UOWManagerImpl.runUnderUOW(UOWManagerImpl.java:628)
at org.apache.openjpa.ee.WASRegistryManagedRuntime.doNonTransactionalWork(WASRegistryManagedRuntime.java:42)
at org.apache.openjpa.ee.AutomaticManagedRuntime.doNonTransactionalWork(AutomaticManagedRuntime.java:312)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:415)
at org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:290)
at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
... 57 more
本人急需解决这个问题,在线等,恳请高手赐教。

解决方案 »

  1.   

    @GeneratedValue(strategy=GenerationType.AUTO) 在oracle中,这个是怎么自增长的呢?
    你尝试下在oracle直接执行sql语句试试
      

  2.   

    Oracle 没什么自动增加,需要使用 GenerationType.SEQUENCE@Id
    // name 随便叫,但要保证在工程中是唯一的
    // sequenceName 是 Oracle 中 sequence 的名字
    @SequenceGenerator(name="T_TEST_ID_GENERATOR", sequenceName="S_TEST", allocationSize = 1, initialValue = 1)
    // 主键策略使用 SEQUENCE
    // name 与上面的那个 name 一样
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="T_TEST_ID_GENERATOR")
    public Integer getId() {
        return this.id;
    }
      

  3.   

    allocationSize 表示取一次可以使用多少次,也就是缓存一下。如果不需要缓存就置为 1
      

  4.   

    二楼的大哥,你说的这种方法,是需要在建表的时候在数据库里面写序列和触发器的,然后再在Entity类里面注释,我在开发的时候首先就想到了这个方法,可是我的PM说不能在数据库里面写序列和触发器啊,所以这个方法行不通啊
      

  5.   


    在orcale界 id自动增是会被鄙视的