在嵌入式类型中将@OneToOne与Cascade.DELETE一起使用 [英] Using @OneToOne with Cascade.DELETE in embedded type

查看:99
本文介绍了在嵌入式类型中将@OneToOne与Cascade.DELETE一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在应用程序中,我将EclipseLink 2.4.1与Java Persistence 2.0.4结合使用.

In an application I use EclipseLink 2.4.1 with Java Persistence 2.0.4.

我在嵌入式类中有一个OneToOne映射.一切正常,除了删除.当我尝试删除包含嵌入式类的对象时,发生以下异常.我检查了一下,并且我不是在代码中某个地方自己调用嵌入式对象.有人知道如何避免该错误或如何解决该错误吗?

I have a OneToOne mapping in an embedded class. Everything works fine, except deleting. When I try to delete the object containing the embedded class, the following exception occurs. I checked and I am not calling remove on the embedded object by myself somewhere in the code. Does anybody knows how to avoid this error or how to get around it?

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)

相关的类片段如下所示(在persistence.xml中添加了Process和LongText)-尝试删除进程时发生错误:

The relevant class snippets look like this (Process and LongText are added in the persistence.xml) - The error occurs when trying to delete a process:

实体类过程

@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

Embedded Class ProcessModelInfo

@Embeddable
public class ProcessModelInfo {

    ...

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

    ...

}

实体类LongText

Entity Class 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方法如下:

The ProcessDao.delete method looks like this:

@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();
    }

}

推荐答案

我看不到这种情况如何发生,但是如果您可以创建可重现的测试用例,请记录一个错误.

I can't see how this would occur, but if you can create a reproducible test case, please log a bug.

检查您是否没有任何可在嵌入式对象上被调用删除的事件. 尝试调试或将日志记录级别设置为最佳.

Check that you don't have any events that may be call remove on the embeddable. Try debugging or set logging level to finest.

您可能想尝试2.5版本,因为它已得到修复(尽管我看不到代码中的任何更改).

You may want to try the 2.5 release, as it may have been fixed (although I don't see any changes in the code).

这篇关于在嵌入式类型中将@OneToOne与Cascade.DELETE一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆