gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:55:41 25 4
gpt4 key购买 nike

我正在使用具有连接继承和如下所示的数据库结构的 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。

真实世界,我也有一个'suppress' 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 类是这两个 Action 的基类,但也构成了抑制 Action 的具体实现。

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

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

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

@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

有多种方法可以让不同的分支拥有多种继承类型。 See this question .

关于java - JPA - 我可以使用@DiscriminatorValue 创建一个没有自己的表的实体类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com