在嵌入类型中使用 @OneToOne 和 Cascade.DELETE

2024-01-25

在应用程序中,我使用 EclipseLink 2.4.1 和 Java Persistence 2.0.4。

我在嵌入式类中有一个 OneToOne 映射。除了删除之外,一切正常。当我尝试删除包含嵌入类的对象时,出现以下异常。我查了一下我没有自己调用嵌入对象上的remove代码中的某处。有谁知道如何避免此错误或如何解决它?

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) - 尝试删除进程时发生错误:

实体类流程

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

    ...

}

实体类长文本

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

}


我不知道这是如何发生的,但如果您可以创建一个可重现的测试用例,请记录一个错误。

检查并确保没有任何可以在可嵌入对象上调用删除的事件。 尝试调试或将日志记录级别设置为最佳。

您可能想尝试 2.5 版本,因为它可能已被修复(尽管我在代码中没有看到任何更改)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在嵌入类型中使用 @OneToOne 和 Cascade.DELETE 的相关文章

随机推荐

  • 如何恢复原来的窗口intellij布局

    我没有选择 恢复默认布局 而是错误地选择了 将当前布局存储为默认布局 因此我当前的布局 我不想使用 被设置为默认布局 现在我不能再去原来的布局了 有没有办法将布局重置为其出厂值 我使用的是intellij 12 1 1 Windows7 布
  • 确保另一条记录尚未包含相同的字段值

    我正在使用 C MVC 为自己的学术目的构建一个小型内容管理系统 我有创建页面的功能 列表页面 删除页面等 在基本层面上 我使用 ID 来验证所有页面的唯一性 但当我使用 MVC 时 页面本质上是一个视图 并且它可以包含剃刀 这一切都没有问
  • python中计数器的求和列表

    我正在寻找 python 中的计数器列表的总和 例如求和 counter list Counter a 1 b 2 Counter b 3 c 4 to give Counter b 5 c 4 a 1 我可以得到以下代码来进行求和 cou
  • Kotlin 推荐使用 SAM 注销监听器的方法

    所以我有一个交互器 它使用 Realm 执行插入操作 然后使用 RealChangeListener 通知插入已完成 它是这样的 fun insertCar item Car realm doInTransaction val car Ca
  • 带 setTimeout 的 for 循环将数字打印到控制台

    I read about closures and find this code for i 0 i lt 5 i setTimeout function console log i 2000 2 秒后输出 5 个数字 5 次 我明白这一点
  • 如何仅在 azure devops CI env 中而不是在本地运行一些测试

    我想指定一些长时间运行的 c 项目 xUnit 测试仅在 azure devops CI 管道中运行 但在本地 Visual Studio 中单击 全部运行 时不运行 vs2019 这种行为有 最佳实践 吗 我尝试制作一个测试播放列表并在本
  • 如何控制 R Markdown 中目录的位置(PDF 输出)?

    YAML 标头 subtitle subtitle title title output pdf document toc true toc depth 2 number sections true 这会将目录放在文档的最开头 但我希望将其
  • 将多个

    元素包裹到

    之间的

    使用 jQuery 我想改变这个 h3 Question 1 h3 p Answer 1 P1 p p Answer 1 P2 p h3 Question 2 h3 p Answer 2 P1 p p Answer 2 P2 p p Ans

  • 将 Angular 4 升级到 Angular 8

    如何将 Angular 4 上的应用程序升级到 Angular 8 我是否需要制作一个新的 Angular 8 应用程序并复制粘贴每个组件并进行相应更改 或者是否有其他合适的方法 我已经经历过几次 每次我最终都会用新版本创建全新的应用程序
  • 使用 Bootstrap 4 方形响应式 div

    我想创建一个类似于的网格系统这一页 https www sohofarmhouse com使用 Bootstrap 4 我想在 col sm 4 中创建一个正方形框 并在其旁边的相同高度的 col sm 8 中创建一个较长的矩形 我在创建响
  • 下面的汇编语言代码如何运行?

    我对装配一无所知 但我被分配了这个任务 请告诉我下面的代码如何运行 我的意思是步骤或程序 TITLE MASM Template main asm Description Revision date f INCLUDE Irvine32 i
  • 如何在 F# 中使用哈希表(从键获取值、添加项目)

    我想知道如何使用System Collections Hashtable在 F 中 它是哈希表的原因是因为我引用了 C 程序集 我将如何调用以下方法 添加 从键中获取值 我在谷歌中找不到任何关于此的有用信息 正如马克指出的 您可以与Hash
  • 如何将轴刻度线的限制调整为与 ggplot 中的边框相同?

    我有下图 我希望对其进行格式化 以便每个轴上的刻度线是由粗黑色边框界定的区域的上部和下部范围 ggplot WPND aes x Year geom line aes y FOX LS colour black size 1 2 linet
  • PHP 中是否有定义公共类、私有类或受保护类

    无论如何 有没有像java一样在命名空间中创建公共或私有或受保护的类 like namespace foo public class Account private class PrivateAccount 请告诉我是否有任何解决方法可以在
  • list 转换为 pid 函数 list_to_pid/1 限制

    在测试开源项目 gproc 功能时 我发现list to pid对于本地pid来说是可以的 对于远程pid来说是不行的 我的 erlang 运行时是 R15B email protected cdn cgi l email protecti
  • 写得很好的 C++ 示例 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • QueryDSL 投影中的集合

    我正在尝试使用投影从实体及其具有的某些关系中提取数据 然而 投影的构造函数采用三个参数 一个集合 整数和另一个整数 如果我没有将集合作为参数 那么这一切都可以正常工作 但是一旦我添加了集合 我就开始收到 SQL 语法查询错误 这是我正在使用
  • 将数据库表从一个 SQL Server 数据库表更新到另一个?

    我正在尝试将数据库字段从一个 SQL Server 表更新到另一个表 我们的生产 SQL Server 是 spdbprod test com spprod 我们的 QA 服务器是 spdbQA test com spQA 我需要从 QA
  • 使用 React 发出和处理全局事件

    我正在玩一点反应来构建一个 添加到购物车按钮 这是我的代码 var ProductPurchase React createClass handleSubmit function e e preventDefault ajax url ca
  • 在嵌入类型中使用 @OneToOne 和 Cascade.DELETE

    在应用程序中 我使用 EclipseLink 2 4 1 和 Java Persistence 2 0 4 我在嵌入式类中有一个 OneToOne 映射 除了删除之外 一切正常 当我尝试删除包含嵌入类的对象时 出现以下异常 我查了一下我没有