问题标签 [discriminator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
851 浏览

inheritance - JPA 中的 SINGLE_TABLE 策略和 getter 中的 @Discriminator 继承

使用 SINGLE_TABLE 策略的 JPA 实体中的继承问题。在 getter 中,@Discriminator 减少了继承范围。

我有以下结构:

问题如下。我有 C 类的对象(假设继承 C 也是 B)。当我在做:

我只获取 B 类的对象,没有 C。但是 C 扩展了 B,所以它也应该在列表中。Getter 构造了这样一个查询:

问题是这个 getter (Something.getListB) 只将此列表减少到 B 类(通过鉴别器 B)。这导致对象类 C 不在列表中。它是由@Discriminator 通过指示严格类型“t1.type = B”引起的。它不允许在那里放置一个像“t1.type IN (B,C)”这样的集合/列表。

自定义 JPQL 查询以不同的方式构造:

他们按照他们应该的方式工作。但是吸气剂呢?

有趣的是,当我将 Something 类从 B 类更改为 A 类(所有人的基础)时:@Entity class Something{ @ManyToMany // blah blah private List listA; // getter 和 setter }

这解决了问题。在查询中的吸气剂中:

消失“AND t1.type =?”。它可以工作,但会干扰从“真实世界对象”到“ORM 实体”的映射。该解决方案发生了变化,使抽象变得更糟。这不是优雅的解决方案。

问题:

我怎么解决这个问题?

我可以在 getter 中使用自定义 JPQL 查询吗?

如何强制该 getter 获取 B 和 C 对象?

你有另一个提议而不是把 List 改成 List 吗???

0 投票
1 回答
478 浏览

jpa - 具有子类型的双向多对多 JPA 映射

我的基本场景是使用 JPA 映射的双向多对多关系。很简单。但是,我需要在映射中添加一个“类型”,并且我正在努力实现最佳实现。这是大纲:

如果我不需要它是双向的(例如,我只需要从网络中获取成员并且不需要能够以另一种方式旅行),对我来说最明显的解决方案是一个链接表每组成员 ( network_member, suppressed_member, added_member),但反过来说就会分崩离析。我想我可以使用单个链接表并将其转换为具有鉴别器列的实体,但是每次我看到有人将链接表用作实体时,代码似乎都变成了灾难。

我发现了许多类似的问题,但这些问题要么过于具体,要么答案并没有完全涵盖我正在寻找的解决方案。有关处理这种情况的最佳方法的任何建议?

0 投票
2 回答
576 浏览

c# - 来自相关表的流利的 nhibernate 鉴别器

我有以下 3 个表的示例值

我有

我希望 nhibernate 在装载车辆 #1 时实例化一个 Concrete1

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

我怎么能用自动映射做到这一点?提前致谢。

编辑1

我开始认为这是不可能的,因此任何解决方法都会受到赞赏。xml(非流利)版本的任何线索也可能有很大帮助。

0 投票
1 回答
562 浏览

fluent-nhibernate - Fluent NHibernate:如何用鉴别器映射多对多关系

我有以下表格和实体需要在 Fluent NHibernate 中进行映射。

表:

这种数据库设计下的思路如下:

  • 一个“工作区”或“元素”可以有几个“附件”文件,一个“附件”文件可以由几个“工作区”或“元素”引用。

  • “工作区”或“元素”可以引用相同的“附件”文件。

所以“attachment”和“workarea”或“element”之间的关系存储在“objectattachment”表中,其中:

  • “attachmentid”字段是指特定“附件”的标识符。

  • “附件类型”字段(鉴别器)定义此关系是在“附件”和“工作区”之间还是在“附件”和“元素”之间。

  • “objectid”字段是指特定“workarea”或“element”的标识符,取决于上述“attachmenttype”字段的值。

然后根据数据库设计,定义领域模型类如下:

现在我的问题是我是否可以将这些域模型类与上述数据库设计进行映射。如果是,那我该怎么做?如果不是,那么如何更改域模型类以支持针对设计数据库的 Fluent NHibernate 映射,因为我不想更改当前的数据库设计(即为“工作区”和“元素”创建单独的“附件”表) .

问候, 权

0 投票
1 回答
1088 浏览

inheritance - Doctrine 2 Discriminator Inheritance Mapping 导致 findBy 方法不起作用

我有 2 个实体,一个作为主要超类,由鉴别器等组成,另一个扩展了这个超类……这样我就可以在一个名为 Action 的表中记录所有动作。

我的鉴别器实体:

这是我用来扩展上述鉴别器实体的实体之一:

当我坚持评论实体时,这很好用,例如

当我坚持时,它成功地将动作添加到动作表中......

但是,我不能再使用任何 findBy、findByOne 方法了,这些方法的任何结果的返回值现在 = null,当我编辑评论类并删除“从动作扩展”时,学说 findby、findOneBy 方法开始工作但是它不会添加到 tmy 鉴别器表中,因为它没有扩展主要的 Actions 超类......

我需要它来扩展 Actions 并让诸如 find、findOneBy 等教义方法也可以工作......

有什么建议么?

0 投票
1 回答
680 浏览

inheritance - 在 Doctrine2 中动态设置鉴别器

我有一个Parent具有 2 个子实体 (FooBar) 实现SINGLE_TABLE继承的实体。

是否可以创建一个new Parent()实体并动态设置它的鉴别器foo而不是创建一个new Foo()

0 投票
1 回答
1292 浏览

hibernate - 映射为实体 Hibernate 的鉴别器列

在hibernate中,是否可以将鉴别器作为一个实体?例如,如果我将 Department 作为基类,并将 AdminDepartment 和 ProcessingDepartment 作为子类。DepartmentType 是鉴别器 & 是映射到 DEPT_TYPE 表的实体。

0 投票
3 回答
3282 浏览

jpa - DiscriminatorColumn 作为主键 / id 的一部分

情况

我有一个 Entity DiscriminatorColumn,配置为单表继承:

'ContainerAssignment' 引用了另一个实体:

一个容器可能有ContainerAssignment每个 TYPE 之一。这意味着表的主键由和ContainerAssignment定义。CONTAINER_IDTYPE

ContainerAssignment有一些子类,例如

SomeTypeOfContainerAssignment给定的CONTAINER_ID.

问题

如果我将 JPA 定义@Id为 ContainerAssignment 表上的 Container,我可以这样做entityManager.find(SomeTypeOfContainerAssignment.class, containerId),这很棒。这与SELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1 AND TYPE = 'SOME_TYPE';. 它知道它需要在这里检查类型,因为@DiscriminatorValue("SOME_TYPE")实体上的注释。

但是,这意味着从 Container 到 ContainerAssignment 的反向引用会中断,因为 Container 并不是真正的主键。例如,如果 Container 有一个@OneToOne(mappedBy=container) private SomeTypeOfContainerAssignment assignment;,当您在容器中读取时,它将通过类似 的方式读取分配SELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1;,而不进行类型检查。这给了它一个容器的所有分配,然后它看似随机地选择一个,可能是错误的类型,在这种情况下,它会抛出一个异常。

相反,如果我将@IdContainerAssignment 的 JPA 定义为使用容器和类型的复合 id,则对 ContainerAssignment 子类的引用可以正常工作。

但是,我不能这样做entityManager.find(SomeTypeOfContainerAssignment.class, containerId),因为 containerId 不是 id。我必须这样做entityManager.find(SomeTypeOfContainerAssignment.class, new MyPk(containerId, "SOME_TYPE")),这似乎是打败了点@DiscriminatorValue("SOME_TYPE")。如果无论如何我必须在 find 上指定类型,我还不如只使用一个 ContainerAssignment Entity。

问题

有没有一种方法可以对单个表继承实体的子类进行工作引用,其中表上的主键在鉴别器列上是复合的,同时也能够EntityManager.find仅通过主键的一部分来实现不是鉴别器?

0 投票
1 回答
2108 浏览

c# - 如何使用子类型鉴别器?

假设我有一个包含许多子类型表的超类型表。我有兴趣使它们成为不相交的子类型,因为超类型表仅指向每行可能的子类型表之一。在网上我遇到了对子类型鉴别器的描述,它是放入超类型表中的一个新列,它是一个小代码(通常是一个字符),用于标识该行属于哪个子类型。

在实践中我找不到任何实际的例子。如果我在 C# 中工作,我想查询表的子类型鉴别器列,然后针对一些键->值列表([子类型鉴别器]->subtype_table_name)进行测试以创建正确的 SQL 来加入正确的表?

或者,SQL Server 中是否已经为此目的提供了一些视图/SQL 查询语法?

基本上,我想知道我必须在哪个级别实际执行逻辑以使鉴别器有用。

0 投票
5 回答
6196 浏览

c# - 将 C# MongoDB LINQ 与鉴别器一起使用

我有一个 MongoDB 集合,其中包含三个不同类(A、B、C)的文档,它们都继承自一个公共类 D。

使用官方 C# 驱动程序,我插入了所有三种类型(A、B、C)的文档,并且它们都正确显示为 _t 鉴别器,并且在我的代码中注册了它们的类映射。

如果我发出如下 LINQ 查询(使用 VB):

如果我计算这个结果,我会收到一个错误“元素'来自类 A 的元素名称'不匹配 C 类的任何字段或属性。”

鉴别器不是要在AsQueryable(Of C)代码中起作用吗?看来,当我发出.Count特定于 C 类元素的 Where 子句时,它正在应用于 A、B 和 C 的文档。

我尝试添加.OfType(Of C)但没有效果,尝试先使用 转换为列表.ToList,但我继续收到相同的错误。有任何想法吗?

作为背景,我的客户端代码通常会处理 D 类型的对象。A、B、C 共享许多从 D 继承的公共属性,我想在这些属性上放置索引,因此我将它们放在一个集合中。但是,有时我需要在特殊情况下直接引用 A、B 或 C 类型的对象。