私はこのコードのビットをDBに保存され、新たな(つまりは、まだデータベースに存在しない)JPAエンティティ持っEntityExistsExceptionを投げる:OpenJPAのが不規則
public abstract class Dao {
@PersistenceContext(name = "puOpenJPA_Core",type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public void save(Fund entity) {
entity = em.merge(entity);
em.flush();
// do something with entity.fundId
}
}
を我々はIDを使用しているため、私たちはflush
を必要としますオブジェクトに他のものを移入させ、IDがDB上に生成される。
エンティティは次のようになります。
@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
が呼び出されたときに断続的なエラーが発生しています。展開後のコードでは、しばらくの間、正常に動作し、その後、突然、この例外をスローを開始:
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のが突然挿入しようとし始めるだろう理由として途方に暮れていますしていますID列の値。
OpenJPAバージョン2.3.0を使用しています。
バージョン2.4.1にアップデートしようとしましたが、問題は解決しません。
私はテーブル 'Fund'はすでに問題を引き起こしているいくつかの古い行を持っている場合は疑いますか? –
そうは思われません - SQLエラーは、それがID列の挿入に関するものであることが非常に限定的です。 –
エラーは明示的で、IDフィールドに値を挿入できないことを示しています。既にIDフィールドが設定されているエンティティに対してmergeを呼び出しています。この例外が発生したときに何をマージしていますか?また、SQLのログオンをオンにして、挿入/更新/削除を確認して、なぜこの問題が発生したかを追跡できます。私の推測では、あなたはエンティティを削除して、それを元に戻そうとしています、そして、IDフィールドはあなたに許されません。 – Chris