나는 코드의이 비트와 함께 DB에 저장됩니다 JPA 엔티티 새로운 (데이터베이스 아직에 즉 존재하지 않는)가 개체에 다른 값을 채우고 ID가 DB에 생성됩니다.는 OpenJPA는 불규칙
엔티티는 다음과 같습니다
@Entity
public class Fund extends AbstractFund implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "fundId")
protected Long id;
// other fields and getters etc.
}
AbstractFund
더 필드가 추상적 인 매핑 된 슈퍼 클래스입니다.
데이터베이스의 테이블에는 ID로 정의 된 fundId
열이 있습니다. 이것은 오랫동안 정상적으로 작동했습니다. 그러나 flush
이 호출되면 간헐적 인 오류가 발생합니다. 배포 후 코드는 잠시 동안 잘 작동하고 갑자기이 예외 던지기 시작 :이 다른 환경에서 재현 할 수 없었와는 OpenJPA가 갑자기을 삽입하려고 시작하는 이유에 관해서는 딱하다 한
Caused by: <openjpa-2.3.0-r422266:1540826 fatal general error> org.apache.openjpa.persistence.PersistenceException:
The transaction has been rolled back. See the nested exceptions for details on the errors that occurred.
FailedObject: [email protected]
at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2370) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2207) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2105) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1876) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.kernel.DelegatingBroker.flush(DelegatingBroker.java:1045) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:663) [openjpa-all-2.3.0.jar:2.3.0]
at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:457) [wildfly-jpa-8.1.0.Final.jar:8.1.0.Final]
......
Caused by: java.lang.Exception: <openjpa-2.3.0-r422266:1540826 fatal store error> org.apache.openjpa.persistence.EntityExistsException:
Cannot insert explicit value for identity column in table 'Fund' when IDENTITY_INSERT is set to OFF. {prepstmnt 2128975916 INSERT INTO Fund
(fundId, ... other columns ...) VALUES (?, ?, ?,)} [code=544, state=23000]
FailedObject: [email protected]
at org.apache.openjpa.util.Exceptions.replaceNestedThrowables(Exceptions.java:255) [openjpa-all-2.3.0.jar:2.3.0]
at org.apache.openjpa.persistence.PersistenceException.writeObject(PersistenceException.java:100) [openjpa-all-2.3.0.jar:2.3.0]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_60]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_60]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_60]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_60]
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:290)
at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:245)
at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:125)
at org.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:341)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:293)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:277)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:277)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:277)
at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:277)
at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:245)
at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:125)
at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:314) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:297) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:249) [wildfly-ejb3-8.1.0.Final.jar:8.1.0.Final]
... 126 more
을 식별 컬럼에 대한 값.
OpenJPA 버전 2.3.0을 사용하고 있습니다.
버전 2.4.1로 업데이트하려고했지만 문제가 계속됩니다.
나는 테이블'Fund' 이미 문제를 일으키는 오래된 행이있는 경우 의심? –
가능성은 희박합니다 - SQL 오류는 ID 열 삽입과 관련하여 매우 구체적입니다. –
오류는 명백합니다. ID 필드에 값을 삽입 할 수 없다는 내용입니다. ID 필드가 이미 설정된 엔터티에 병합을 호출하고 있습니다. 이 예외가 발생하면 병합 중 무엇이고 SQL 삽입을 시도하여 삽입/업데이트/삭제를 볼 수 있으므로이 문제가 발생한 이유를 추적 할 수 있습니다. 내 생각 엔 엔티티를 삭제하고이를 다시 병합하려고 시도하고 있으며 ID 필드가 당신을 허용하지 않을 것입니다. – Chris