当前位置: 首页 > 知识库问答 >
问题:

两个结构相同但表不同的JPA/Spring数据实体

甘西岭
2023-03-14

我的应用程序需要存储一组与另一个“真实”表具有相同数据库结构的“暂存数据”,但在人工查看暂存数据的内容之前,不能将其写入真实表。这些不仅是对实际表的添加,而且是对它的更新(因此,换句话说,在staging table中,有一些值与实际表具有相同的主键,因为它们引用了相同的实体实例)。

我的方法是让两个JPA@Entity对象具有相同的结构(即字段、列名等),但存储在不同的表中,并与SpringCrudepository透视图完全分开处理(即,任何时候都不会发生联合查询来合并两个表中的查询结果)。然而,我希望使用继承使它们能够互换处理,这样我的应用程序就不会真正知道/关心它是否在处理真正的登台数据,因此我不必编写大量样板文件getter/setter/converter代码。

所以,我现在基本上有三个类:

  1. @MappedSuperclass注释并通过@id注释识别公共id属性的BaseEntity

在某些条件下,我想基本上获取包含StagingIdfier对象的表的内容并将其合并(即更新现有条目、添加新条目等)到包含标识符对象的表中。我正在使用Envers进行数据库审计,所以真的不想做任何低级数据库的事情,这意味着我失去了任何可审计性。

当我使用crudepository时

组织。springframework。奥姆。ObjectRetrievalFailureException:对象[id=null]不属于指定的子类[com.domain.Identifier]:给定对象的类与持久副本的类不匹配;

嵌套的异常是org。冬眠ErrorClassException:对象[id=null]不属于指定的子类[com.domain.Identifier]:给定对象的类与持久副本的类不匹配

当我看到Hibernate生成的SQL时,我看到:

...因此,上面的查询同时获取IdentifierStagingIdentifier对象,这就解释了错误。

那么,我想做的有可能吗?


共有1个答案

弘柏
2023-03-14

我最终做的是按照如下方式重组我的课程:

  1. BaseEntity=我的问题没有改变
  2. AbstractIdentifier=新的抽象类,它通过@MappedSuperclass注释扩展了BaseEntity,该注释将标识符类的所有属性、getter、setter等移到
  3. IdentifierStagingIdentifier现在几乎都是存根类,它们扩展了AbstractIdentifier,但具有不同的@Table注释值和它们自己的Spring数据存储库

然后,我编写了一些方法来在需要时(尽管我不想这样做)和单元测试之间转换标识符StagingIdfier以确保这些方法的正确性

 类似资料:
  • 问题内容: 好的,这是我的难题,我建立了一个数据库,其中包含约5个表,所有表的数据结构完全相同。出于本地化的目的,以这种方式分离了数据,并总共分割了约450万条记录。 在大多数情况下,只需要一张桌子就可以了。但是,有时需要两个或多个表中的数据,并且需要按用户定义的列对数据进行排序。这就是我遇到的问题。 数据列: MySQL陈述: MySQL吐出这个错误: 显然,我做错了。有人愿意为我阐明一下吗?

  • 问题内容: 我的table1和table2具有相同的架构…,我只想拥有一个实体,而不是两个(因为字段将是相同的)。在XML映射的hibernate状态下,我将如何实现这一点。所以我的目标是当我在DAO中进行查询时,如果两个表都映射到同一实体,它将如何知道要从哪个表中提取。 我试图不创建父类,然后再创建两个子类。 谢谢 问题答案: 抱歉回复晚了。我已经在stackoverflow上回答了几次这个问题

  • 我在Spring有一个项目,我必须读两本。txt文件,一个有许多行,另一个是控制文件,其中包含应从第一个文件读取的行数。我知道我必须使用分区来处理这些文件,因为第一个文件非常大,我需要对其进行分区,并能够在失败时重新启动,但我不知道读者应该如何处理这些文件,因为两个文件的行宽度不同。没有一个文件的行中有标题或分隔符,因此我必须根据主要在第一行中的范围来获取字段<我的一个疑问是,我是否应该在同一个读

  • 我需要帮助设置一个应用程序,该应用程序将内部(主)MS SQL数据库DB1中的数据子集复制到另一个MySQL数据库DB2中,该数据库在Web服务器上运行,供Web应用程序使用(即,我想同步这两个数据库)。这两个数据库上的表具有相同的名称,尽管DB2上只定义了属性/列的子集。我想使用(xml配置的)spring、spring data jpa(即JpaRepository接口)和hibernate作

  • 我有一个使用iReport在jasper报告2.0.4中创建的报告。我有两个子报告。这两个子报告共享相同的jrxml。我在参数中传递jrxml作为子报告的报告表达式。我有这个参数的代码 一切都很好。问题出在两个子报表数据源上 这些子报表的数据源来自作为参数传递的同一个POJOs列表 以下是两个子报表的子报表jrxml代码 第一 第二 您看,这两个子报告具有相同的代码。 奇怪的是,两个子报告显示,但

  • 让Person是一个具有属性name、age和idNumber的类。我希望有一个“人”的集合,我希望能够以最有效的方式执行以下操作: 通过他们的ID号检索他们。 获取年龄的人的列表 我的想法是同时维护一个使用id作为键的Hashmap和两个使用age和name作为每个树映射键的树映射。 这是最好的方式吗