问题标签 [composite-id]

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 投票
3 回答
3867 浏览

hibernate - JPA / Hibernate中的复合键与继承类

我在我的类结构上定义了一个复合 ID,如下所示。不幸的是,我总是收到一个休眠错误,抱怨找不到“part2”:

“在实体 MoreClass 中找不到 @IdClass 的属性:第 2 部分”

有人可以帮我解决问题吗?(或者至少指出我有用的 jpa/hibernate 文档?)

0 投票
2 回答
1213 浏览

nhibernate - NHibernate:使用 merge() 时不更新子复合 ID

映射:

实体:

单元测试:

nHib 生成的 SQL:


所以,如您所见,问题在于 nHib 在保存其父级后不会更新子级复合 ID,并且尝试保存子级失败。为什么??如何让 nHib 更新这些 ID?另外,如果我使用 SaveOrUpdate() 而不是 Merge(),它工作正常!!但我必须使用合并。请帮忙!

0 投票
1 回答
1636 浏览

fluent-nhibernate - Fluent NHibernate 在复合键上插入后进行更新

我正在使用 Fluent NHibernate 来映射复合键。我需要子实体在创建父实体时接收新插入的父密钥。这可行,但 NHibernate 正在对子项进行插入,然后对子项上的一个复合键 ID 进行更新。

实体关系如下:

1) Model (parent) - 有很多 FactorWeights。
2) FactorWeight (child) 有一个 Factor。
3) 每个模型的因素可以有不同的权重。

由于模型有许多因子,并且因子可以对不同的模型具有不同的权重,因此需要因子权重实体与模型ID 和因子ID 的复合键。

模型:

因素:

因素权重:

映射如下:

模型:

因子权重

我使用以下代码在 Model 对象中创建 FactorWeight:

以下用于持久化实体(将模型传递给方法):

模型实体和 FactorWeight 都被正确保存。问题是 SQL Profiler 在插入后立即显示 FactorWeight.ModelID 列的更新。NHibernate 使用插入中已经存在的新插入的 ModelID 更新 FactorWeight.ModelID。

SQL Profiler 跟踪:

我认为这是复合键映射的问题。

我正在使用 NHibernate 的 2.1.2.400 版和 FluentNHibernate 的 1.1.0.685 版。

谢谢你。

0 投票
0 回答
575 浏览

fluent-nhibernate - Fluent NHibernate HasManyToMany() IDictionary<> Composite ID问题

我正在使用 Fluent NHibernate 1.1.1.694,它使用的语法与 FNH1.0 略有不同,尤其是在字典映射方面。

在我的模型中,我有员工、地址和地址类型(邮政、物理等)。

我的映射

生成以下 .hbm.xml 片段:

我想生成的 .hbm.xml是

显然这会失败,因为我没有告诉它有一个复合 ID 可用于父键。但我找不到告诉它的方法。.HasManyToMany<Key,Value>() 的 .Columns 和 .ParentKeyColumns 不存在

我应该如何映射这个?

0 投票
2 回答
9613 浏览

nhibernate - 流利的 NHibernate 复合标识到映射类

我试图弄清楚如何使用 CompositeId 来映射另一个类。这是一个测试用例:

表格:

C# 中的类:

Fluent NHibernate 映射:

当我尝试添加新记录时,我收到此错误:

System.ArgumentOutOfRangeException :索引超出范围。必须是非负数且小于集合的大小。参数名称:索引

我知道这个错误是由于在 CompositeId 和 References 调用中映射了 TestParentId 列。但是,在根据 TestParentId 查询 TestChild 时,删除 References 调用会导致另一个错误。

这是执行查询的代码:

关于如何为此场景创建复合键的任何想法?

0 投票
1 回答
1304 浏览

fluent-nhibernate - Fluent Nhibernate 3 映射复合字段(自定义类型)

大家好,我的场景

其中 Function AND Profile 是两个容易映射的实体。当我运行我有这个错误:

无法确定类型:Data.Model.Entities.Function、Data.Model、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null,对于列:NHibernate.Mapping.Column(FunctionID)"}

有没有办法避免这种情况?最终我需要使用由两个自定义映射类制作的 CompositeID 创建一个类。如果我将compositeID与int字段一起使用,它就像一个魅力

提前致谢

功能(类似配置文件)映射

0 投票
1 回答
180 浏览

nhibernate - 从 nhibernate 中的复合 ID 列表中加载对象

我想要做的是构建一个 HQL 查询,它接受一个 id 列表并返回一个加载的对象列表。过了一会儿,我发现这样的东西可以工作

但是,这仅适用于单个 id,因为当我尝试将其用于复合 id 时,应用程序会引发下一个异常:

System.ArgumentOutOfRangeException :索引超出范围。必须是非负数且小于集合的大小。参数名称:索引

我一无所知...

我为我的 id 对象创建了一个自定义类型,希望我可以解释 hibernate 如何使用它,但它没有成功。

那么你有什么想法吗?

谢谢

0 投票
1 回答
858 浏览

hibernate - 休眠:通过更改复合ID主键的一部分来插入新行?

我正在尝试将新行插入数据库,但未能让 Hibernate 识别必须插入我的对象。我有一个 Sponsor 表、一个 Course 表和一个 SponsorCourse 表,它是两者的交集。SponsorCourse 的主键是 SponsorCoursePK 类的复合 ID,它包含两个整数:Sponsor 的主键和 Course 的主键。SponsorCoursePK 实现 equals() 和 hashcode()。

我的目标是创建 Course 表的深层副本,包括其所有 SponsorCourse 行。

  • 我首先向 Hibernate 询问与现有 Course 行关联的 SponsorCourses 列表。
  • 接下来我创建一个新的 Course 对象并将其提交到数据库。(由于遗留原因,Course 对象不由 Hibernate 管理)。
  • 接下来,我遍历 Hibernate 为旧课程提供给我的 SponsorCourses 列表,并将保存课程 ID 的 SponsorCourse 主键部分从旧课程 ID 更改为新创建课程的 ID。
  • 接下来我调用 saveOrUpdate 来尝试让 Hibernate 创建新行。

当我查看 SQL Hibernate 发送时,不存在“插入”语句:即使我更改了主键的一部分,Hibernate 也无法识别我的新对象是“脏的”并且需要插入。如果我更改 SponsorCourse 的任何其他值,Hibernate 会将该对象识别为脏对象并插入一个新行。

我的替代方法是创建全新的 SponsorCourse 对象并将其持久化。我很困惑,因为对于主键不是复合主键的其他子表,它似乎可以获取一行,更改主键,然后允许 Hibernate 基于脏对象插入一个新行首要的关键。

Hibernate 文档,特别是 Hibernate 3.0 参考的第 8.4 章(复合 id)和第 10 章(讨论对象的修改)不足以帮助我理解。

通过认为我可以更改 Hibernate 获取的对象的主键并认为它会插入新行,我是否期待出现错误?在这种情况下,我是否应该始终创建自己的新对象?或者,尝试通过更改作为复合 ID 的主键的一部分来强制插入是否是一个独特的问题?

谢谢你。可能很明显,我是这个框架的新手。

0 投票
1 回答
310 浏览

nhibernate - NHibernate 使用复合键发出冗余查询

为了这个例子,假设我必须为我国税收服务数据库的“人”实体建模,而在我这个很小的国家,一个人的名字和姓氏足以唯一标识此人。此外,税收服务的数据库不使用代理键,添加代理键将使该国未来 10 年的 GDP 归零。

Persons表包含三个字段:

  • 目前的地址

而且,考虑到我所在国家/地区的规模,该表对 < FirstName , LastName > 列对具有唯一约束。

鉴于此架构,我非常简单的Person类具有以下成员:

  • KeyPersonKey类的实例,它又具有FirstNameLastName成员,当然实现了Equals()GetHashCode()
  • CurrentAddress:一个简单的字符串。

NHibernate 映射如下所示:

到目前为止一切顺利,这个映射工作正常,我可以愉快地从数据库中加载Person实体。

但是,当我深入了解时,我可以看到在加载整个人员集时,NHibernate 执行以下操作:

  1. 打开记录集以仅从Persons表中加载关键属性(即仅FirstNameLastName字段) ;
  2. 对于从Persons加载的每个 < FirstName , LastName > 对,它发出一个 SELECT - 当然也针对Persons - 为具有该FirstNameLastName的人加载 CurrentAddress 。

换句话说,NHibernate 首先加载键,然后发出一系列 SELECT 来分别加载每个Person,在 WHERE 子句中提供键。

如果我对写入数据库不感兴趣,有没有办法告诉 NHibernate 它可以使用单个记录集从表中检索键非键属性?

0 投票
1 回答
225 浏览

nhibernate - 如何在流利的 Nhibernate 中使用接口作为 CompositeID 的一部分

我在使用复合键时无法弄清楚如何映射接口。

我想要做的是:

References 没有问题,但我无法让 KeyReference 工作,而且似乎没有任何“.Class”我可以像使用 References 一样使用。

我读:

流利的 NHibernate,使用接口

使用 Fluent NHibernate 映射时对接口进行编程

这让我解决了引用问题,但我还没有找到解决 KeyReference 的方法。有什么明显的我失踪了,因为我已经在谷歌上搜索了一段时间,到目前为止还没有找到任何东西。