JPA - 我可以使用 @DiscriminatorValue 创建一个没有自己的表的实体类吗?

2024-01-25

我使用带有联合继承的 JPA 和如下所示的数据库结构:

ACTION
---------
ACTION_ID
ACTION_MAPPING_ID
ACTION_TYPE

DELIVERY_CHANNEL_ACTION
--------------------------
ACTION_ID
CHANNEL_ID

OVERRIDE_ADDRESS_ACTION
--------------------------
ACTION_ID
(various fields specific to this action type)

因此,用简单的英语来说,我有多种不同类型的操作,所有操作都共享一个 ACTION_MAPPING,它是从“父”ACTION 表引用的。 DELIVERY_CHANNEL_ACTION 和 OVERRIDE_ADDRESS_ACTION 都有自己的额外补充数据,并通过 FK 映射到 ACTION。

现实世界中,我也有一个“抑制”操作,但是它自己没有任何补充数据,因此它没有相应的表 - 它需要的只是一个 ACTION_MAPPING,它存储在 ACTION 表中。

我正在从头开始创建一个新项目,因此我可以做的事情非常灵活,但显然希望从一开始就做好!

我当前的实现有效,具有三个松散定义的实体,如下所示:

@Entity
@Table(name="ACTION")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorValue("SUPPRESS")
public class Action

@Entity
@Table(name="DELIVERY_CHANNEL_ACTION")
@DiscriminatorValue("DELIVERY_CHANNEL")
public class DeliveryChannelAction extends Action

@Entity
@Table(name="OVERRIDE_ADDRESS_ACTION")
@DiscriminatorValue("OVERRIDE_ADDRESS")
public class OverrideAddressAction extends Action

也就是说 - 我有一个具体的基类 Action,具有 Joined 继承策略。 DeliveryChannelAction 和 OverrideAddressAction 都扩展了 Action。

但这里感觉不对的是,我的 Action 类是这两个操作的基类,但也形成了抑制操作的具体实现。

目前这可行,但在某些时候可能会添加更多操作,并且其中一些操作(例如 SUPPRESS)很可能没​​有补充数据,这将开始变得困难!

所以......在对象模型世界中,我想做的就是让 Action 变得抽象,并创建一个 SuppressAction 类,除了 @DiscriminatorValue("SUPPRESS") 之外,该类是空的。

我已经尝试完全按照上面描述的操作,因此,将操作更改为:

@Entity
@Table(name="ACTION")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Action

并创建:

@DiscriminatorValue("SUPPRESS")
public class SuppressAction extends Action

但运气不好 - 它似乎对于 DeliveryChannelAction 和 OverrideAddressAction 工作得很好,但是当我尝试创建 SuppressAction 并保留它时,我得到:

java.lang.IllegalArgumentException: Object: com.mypackage.SuppressAction[actionId=null] is not a known entity type.
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4147)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:368)
    at com.mypackage.test.util.EntityTestUtil.createSuppressAction(EntityTestUtil.java:672)
    at com.mypackage.entities.ActionTest.testCRUDAction(ActionTest.java:27)

我认为这是由于 SuppressAction 没有注册为实体,但我不知道如何才能做到这一点,因为它没有关联的表。

任何指示,无论是完整的答案还是谷歌的提示(我没有想法!),非常欢迎。


你可以,与InheritanceType.SINGLE_TABLE http://java.sun.com/javaee/5/docs/api/javax/persistence/InheritanceType.html#SINGLE_TABLE

有多种方法可以为不同的分支提供多种继承类型。看到这个问题 https://stackoverflow.com/questions/1825676/changing-the-inheritance-strategy-in-branches-of-the-class-hierarchy-via-jpa-anno.

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

JPA - 我可以使用 @DiscriminatorValue 创建一个没有自己的表的实体类吗? 的相关文章

随机推荐

  • 如何修复非法指令(核心转储)

    您好 我正在尝试解决此问题 当我运行下面的 python3 Brain py 时 出现此错误 非法指令 核心转储 from imageai Prediction import ImagePrediction import os execut
  • 生产中的 Create-React-App:找不到路由

    我有一个以 Create React App 和 Express js 作为后端的全栈应用程序 开发设置 CRA 在端口 3000 上运行 是由 CRA 的代理实现的 因此我可以将某些路由直接转发到后端 在端口 5000 上运行 proxy
  • 通过notifyDataSetChanged() 没有更改/黑屏;

    我想做这样的事情 同时按下refresh按钮 它将刷新列表 活动代码如下 adapter new TweetAdapter Welcome this tweets users tweetsList setAdapter adapter pr
  • 这个语法是什么意思? (序言)

    我一直在尝试学习 Prolog 并在一些示例代码中遇到了这种语法 solve Hs Hs member h dog Hs 这只是代码的一部分 但我对h dog does 任何帮助将不胜感激 下划线 只是表明该位置有一个值 但我们不关心它 第
  • 使用 BeginInvoke 和 EndInvoke 时,如何避免必须传递/存储委托?

    Edit 将实际问题移至顶部 Update 找到了微软的一个例子 最后添加了一些代码 我的问题是 在同一个委托实例上调用多个 BeginInvoke 调用是否安全 或者我是否必须为每个正在进行的方法调用构造一个新的委托实例 如果我必须为每个
  • Java 8 扩展流

    我正在尝试扩展 Java 8 的 Stream 实现 我有这个界面 public interface StreamStuff
  • git pull 导致“文件取消链接失败”错误

    我正在尝试做一个git pull我遇到了可怕的 取消文件 xxx 链接失败 错误 我已经尝试过 ProcessExplorer 中定义的this https stackoverflow com a 6076796 341611回答 使用 f
  • 访问 ActiveDirectory 的代码的单元测试

    对访问 ActiveDirectory 的应用程序进行单元测试和 或模拟对 AD 的依赖关系的最佳方法是什么 所有必需的类型 例如DirectorySearcher and DirectoryEntry看起来并不容易被嘲笑 我们有类似的方法
  • 使用 htaccess 文件删除 html 扩展名

    我知道这是一个非常常见的话题 但没有一个解决方案适合我 我尝试过几个答案 answer 1 https stackoverflow com questions 15728888 how do i remove html extensions
  • C++ 指针数组:删除还是删除[]?

    考虑以下代码 class Foo Monster monsters 6 Foo for int i 0 i lt 6 i monsters i new Monster virtual Foo 什么是正确的析构函数 this Foo Foo
  • 使用C打开目录

    我接受通过命令行输入的路径 当我做 dir opendir args 1 它不会进入循环 即dir null 如何将命令行输入传递给 dir 指针 void main int c char args DIR dir struct diren
  • 从 IzPack 调用 Java 类

    如何从 IzPack 调用 Java 类的方法 静态方法是可以的 我需要能够传递参数 谢谢你 背景资料 我正在尝试编写一个 IzPack 安装程序 它能够检测以前安装的应用程序版本 在发现它并不真正支持此功能 Windows 除外 后 我认
  • SQLite 删除查询不起作用?

    我有以下代码来从名为 posts 的表中删除一行 由于某种原因 该帖子没有被删除 我还尝试通过命令行手动管理命令 效果很好 我也确信 post id 是正确的并且不为空 因为我也尝试过将其传回并打印它并且 ID 显示正确 我应该提到它不会吐
  • Pandas:在每 60 秒的 bin 中仅保留第一行数据

    在 pandas 中仅保留每 60 秒数据箱的第一行的最佳方法是什么 即对于在增加的时间发生的每一行t 我想删除所有出现的行t 60秒 我知道有一些组合groupby first 我可能可以使用 但是我见过的代码示例 例如使用pandas
  • TFSBuild/MSBuild 和项目参考与文件参考

    我们有一个使用项目引用的大型 VS 解决方案 该解决方案由 TFS Build 构建 如下所示 Solution Project 1 Project 2 Project Project N 由于解决方案太大 我们有几个日常使用的较小解决方案
  • 如何显示 tiff 图像?

    我完全迷失了 我需要一些人来指导我 我看过很多帖子 但没有解释如何显示 tif 图像 我在哪里可以找到一些教程 如果可能的话 我需要从一开始 或者如果你能帮助我那就太好了 我只是一个持有图像的新手 我使用 mvc 4 正如您可能发现的那样
  • 命令提示符中“cls”之后但不在“cls”之前的彩色文本

    我有一个 python 程序 我试图在命令提示符中使用 ANSI 代码以彩色文本打印 Hello 当我正常打印时 它不起作用 它只是打印 和文本 但是当我在清除命令提示符后打印它时 它工作正常 有人可以解释一下这种奇怪的性质吗 我搜索了这个
  • 单个 TextView 中的多个 TypeFace

    我想将第一个字符设置为TextView with a TypeFace以及具有不同类型面孔的第二个角色 依此类推 我读过这个例子 Spannable str Spannable textView getText str setSpan ne
  • 在 Symfony2 中测试文件上传

    在 Symfony2 文档中 它给出了一个简单的示例 client gt request POST submit array name gt Fabien array photo gt path to photo 模拟文件上传 然而 在我的
  • JPA - 我可以使用 @DiscriminatorValue 创建一个没有自己的表的实体类吗?

    我使用带有联合继承的 JPA 和如下所示的数据库结构 ACTION ACTION ID ACTION MAPPING ID ACTION TYPE DELIVERY CHANNEL ACTION ACTION ID CHANNEL ID O