4

アプリケーションでは、EclipseLink 2.4.1 と Java Persistence 2.0.4 を使用しています。

埋め込みクラスに OneToOne マッピングがあります。削除を除いて、すべて正常に動作します。埋め込みクラスを含むオブジェクトを削除しようとすると、次の例外が発生します。チェックしたところ、コードのどこかで自分で埋め込みオブジェクトの削除を呼び出していません。このエラーを回避する方法または回避する方法を知っている人はいますか?

Exception [EclipseLink-6002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.QueryException
Exception Description: Aggregated objects cannot be written/deleted/queried independently from their owners. 
Descriptor: [RelationalDescriptor(org.openlca.web.model.ProcessModelInfo --> [])]
Query: DeleteObjectQuery(org.openlca.web.model.ProcessModelInfo@77cc2975)
    at org.eclipse.persistence.exceptions.QueryException.aggregateObjectCannotBeDeletedOrWritten(QueryException.java:240)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.prepare(ObjectLevelModifyQuery.java:205)
    at org.eclipse.persistence.queries.DeleteObjectQuery.prepare(DeleteObjectQuery.java:327)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:614)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:575)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:820)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:751)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
    at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:119)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1535)
    at org.eclipse.persistence.queries.DeleteObjectQuery.executeDatabaseQuery(DeleteObjectQuery.java:194)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:852)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:751)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
    at org.eclipse.persistence.queries.DeleteObjectQuery.executeInUnitOfWorkObjectLevelModifyQuery(DeleteObjectQuery.java:119)
    at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2875)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1602)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1584)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1535)
    at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:334)
    at org.eclipse.persistence.internal.sessions.CommitManager.deleteAllObjects(CommitManager.java:288)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1422)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:634)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1509)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:266)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1147)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:84)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
    at org.project.ProcessDao.delete(ProcessDao.java:41)

関連するクラス スニペットは次のようになります (Process と LongText は persistence.xml に追加されます) - プロセスを削除しようとするとエラーが発生します。

エンティティ クラス プロセス

@Entity
public class Process {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "process_seq")
    @Column(name = "id")
    private long id;

    ....

    @Embedded
    private ProcessModelInfo modelInfo = new ProcessModelInfo();

    ....

} 

埋め込みクラス ProcessModelInfo

@Embeddable
public class ProcessModelInfo {

    ...

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name= "f_modelling_constants")
    private LongText modellingConstants = new LongText();

    ...

}

エンティティ クラス LongText

@Entity
@Table(name = "tbl_long_texts")
public class LongText {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "long_text_seq")
    @Column(name = "id")
    private long id;

    @Lob
    @Column(name = "text")
    private String text;

    ....

}

ProcessDao.delete メソッドは次のようになります。

@Override
public void delete(Process entity) throws Exception {
    if (entity == null)
        return;
    EntityManager em = createManager();
    try {
        em.getTransaction().begin();
        em.remove(em.merge(entity));
        em.getTransaction().commit();
    } finally {
        em.close();
    }

}

4

1 に答える 1

0

これがどのように発生するかはわかりませんが、再現可能なテスト ケースを作成できる場合は、バグを記録してください。

埋め込み可能なもので remove を呼び出す可能性のあるイベントがないことを確認してください。デバッグを試みるか、ログ レベルを最高に設定してください。

修正されている可能性があるため、2.5 リリースを試してみることをお勧めします (ただし、コードに変更は見られません)。

于 2013-06-12T13:41:54.000 に答える