持久化EJB时出现Oracle错误

时间:2017-04-29 01:07:20

标签: oracle jpa java-ee ejb jpql

Stacktrace 1:来自方法“submitTicket”第74行的错误:em.persist(bean);

at com.sun.proxy.$Proxy237.creer(Unknown Source)
    at projet.helpdesk.dao.__EJB31_Generated__TicketDao__Intf____Bean__.creer(Unknown Source)
    at projet.helpdesk.form.CreationTicketForm.soumettreTicket(CreationTicketForm.java:74)

Stacktrace 2:

    Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01502: index 'BDD2.TICKETS_PK' or partition of such index is in unusable state

Error Code: 1502
Call: INSERT INTO Tickets (ID_TICKET, DATE_ENVOI, DATE_FERMETURE, DESCRIPTION, ETAT, ID_EMPLOYE, ID_TECHNICIEN, PRIORITE, SUJET) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [9 parameters bound]
Query: InsertObjectQuery(projet.helpdesk.beans.Ticket@1d796c68)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)

在我重新启动电脑后,提到ORA-1502 ERROR开始显示,之前是ORA-0001 ERROR,它描述了重复值问题。

当我通过em.persist(bean);插入bean时,主键aka id_ticket设置为null,它是Oracle中使用的一个Trigger,用于递增值。

1 个答案:

答案 0 :(得分:-1)

Java持久性查询语言似乎为插入时没有值而不是将它们作为空对象发送的主键生成0,所以我只是在ORACLE中更改了生成主键的触发器,如下所示:

create or replace trigger "BI_TICKETS"   
  before insert on "TICKETS"               
  for each row  
begin   
  if :NEW."ID_TICKET" is null or :NEW."ID_TICKET"=0 then 
    select "TICKETS_SEQ".nextval into :NEW."ID_TICKET" from dual; 
  end if; 
end; 
​

在条件中添加了:NEW."ID_TICKET"= 0,并且已完成。