问题标签 [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 投票
2 回答
13184 浏览

java - Jpa 复合键可为空的列

我正在使用 Hibernate 的 JPA impl 对一些表进行建模。我在映射一个表时遇到问题:

  • 没有主键
  • 在 4 列上具有唯一索引,其中 3 列可以为空

我试图破解它并将索引定义为复合 ID,但由于某些列可以为空,因此无法正常工作。这对 JPA/Hibernate 可行吗?

谢谢

0 投票
4 回答
6375 浏览

c# - 使用 NHibernate 插入带有复合键的记录

我正在使用一个使用复合键的旧数据库。我正在尝试使用 NHibernate 将新记录插入数据库。NHibernate 指定我必须手动创建 ID,但是当我尝试使用此 ID 插入时,我收到以下消息:

我无法触摸任何数据库设置,因为它们由美国总部管理。

我发现我可以通过以下方式进行数据库插入:

并且该tablename_id列会自动递增。

是否可以编写某种处理程序,允许我ID使用集合创建一个对象CountryId并让它自动增加Id属性。

干杯。


示例代码:

表定义:

类文件:

映射文件:

0 投票
2 回答
932 浏览

c# - 是否可以通过复合 ID 的键多对一进行导航?

是否可以在 Nhibernate 中浏览复合 ID 的键多对一关联?

我有一些使用以下设置映射的(旧版)表:

我想通过查询中的 StructureUser 类访问 Structure 的“Low”属性。我尝试了我能想到的 Criteria API 的所有用法,但总是出错。这是我尝试的两个查询:

crit1 中的错误来自数据库并说“struc_1.Low 在此上下文中无效”,因为 NHibernate 不会生成 sql 命令中的限制所需的连接。crit2 中的错误来自 NHibernate,告诉我它无法访问 StructureUser 上的“Structure.Low”属性。

我通过使用 key-property 元素声明复合 ID 并声明与普通多对一元素的关系来解决这个问题。

这个问题还有其他解决方案吗?

0 投票
1 回答
3118 浏览

nhibernate - 键多对一和键属性关联:nhibernate 不会从集合中删除项目

我会尽量保持简洁,但希望不会在我的麻烦中错过任何重要信息。我相信的代码提供了所有细节,但我忽略了噪音(它是 VB,所以有很多噪音:))。

一个“Case”对象有很多“Assignments”:

我收到的数据模型看起来像你所期望的那样,除了 CaseAssignment 是一个复合键:

最后,流畅的 NHibernate 映射:

KeyReference 与 XML 映射术语中的“键多对一”相关。

当我向案例添加分配时,一切都很好,但是当我删除引用时,我遇到了两个问题之一。使用此代码:

我得到的错误是,“无法删除集合行......无法将值 NULL 插入到列 'CaseId'、表 'CaseAssignments';列不允许空值。更新失败。语句已终止。” 这是由于尝试发出以下 SQL:

所以有点乱。所以我试试这段代码:

并且错误是“意外的行数:0;预期:1”,因为 NHibernate 尝试:从 CaseAssignments 中删除 RoleId = [valid guid] AND CaseId = NULL

我一直在搜索线程和论坛以及 NHibernate 和 Hibernate 文档,但还没有真正遇到过类似的东西。希望这很简单。感谢任何对此进行拍摄的人!

0 投票
1 回答
8688 浏览

inheritance - Fluent NHibernate 从继承的复合 ID 映射复合 ID

假设我有一个包含以下 3 个表的现有数据库:

表 1:
(PK)T1ID1
(PK)T1ID2

表2:
(PK)T2ID1

表 3:
(FK)T1ID1
(FK)T1ID2
(FK)T2ID1(其中 3 个键来自上表)

我的问题是:如何使用 Fluent NHibernate 映射 Table3?
令我困惑的是如何处理它的复合键来自 2 个不同的表这一事实。

对于表 1 和表 2,我有以下映射:

0 投票
1 回答
1343 浏览

nhibernate - NHibernate 子类和组合键

我有一个类 StoreHours ,它有一个复合键并且一直运行良好。一个新的要求出现了,要求返回另一种类型的时间。我想“很简单,我将抽象基类,有两个具体的实现,并将我在应用程序中的引用更改为新类之一”。但是,这样做后,我的单元测试失败了

X.Test.StoreTest.HoursTest:NHibernate.InstantiationException:无法实例化抽象类或接口:X.Model.StoreHours

我的映射文件看起来像

我在这里找到了有类似问题的人并开始了他们的解决方案,但实际上最终遇到的麻烦比我开始时还要多。

我可以完美地将记录保存到数据库中,但是在加载时,NHibernate 正在尝试实例化抽象的“StoreHours”,即使我只有一个强类型设置“OfficeHours”

这似乎是一个非常微不足道的要求,所以我认为我必须做一些简单的错误。所有提示表示赞赏。

0 投票
1 回答
1430 浏览

mysql - (Fluent) NHibernate 复合标识问题:MySQL 抱怨参数索引超出范围

我正在使用 Fluent NHibernate 创建一个 ASP.NET MVC 项目,用户提交和投票(上/下)。

当然,用户可以投票赞成或反对。为了记录这一点,我创建了一个中间表 SubmissionVote,其中包含以下字段:

这是我的映射:

提交

用户

提交投票

由于我的数据库中的中间表有一个 score 字段,我创建了 SubmissionVote 类来表示它。该类中的用户和提交字段与其各自的类是多对一的关系。

问题是:SubmissionVote 类需要有一个 ID 属性,否则 NHibernate 会产生错误。情况不应该如此,因为 SubmissionVote 的 ID 是复合 ID,如映射中所示。

我可以忍受,但它会导致另一个问题。当我尝试使用 session.SaveOrUpdate(submission) 保存包含几个 SubmissionVotes 的提交时,我收到这个错误 MySQL 抛出的 ArrayOutOfBounds 异常,就像在这个问题中一样:我如何使用带有类的复合 ID 作为流利的nhibernate中的id字段?.

查看 NHibernate 日志,我可以看到发送到 MySQL 的查询。

显然,NHibernate 试图在查询中包含一个默认的“ID”值('0')(可能是我添加到 SubmissionVote 的 ID 属性)。

这两个问题有关系吗?我怎么解决这个问题?

非常感谢你!

编辑

这是我由 NHibernate 生成的(部分但相关的)模式。

0 投票
0 回答
660 浏览

nhibernate - NHibernate - 复合 ID - 3

我在 Nhibernate hbm 文件中有一个类,为此我使用复合 id 字段,方式如下:

其中 DContent 和 Structure 是类,Language 是一个 int。

我已经覆盖了 Equals 和 GetHashCode 方法,以跟踪复合键中的 3 个对象,但我发现当它在数据库中创建表时,只有两个 DId 和 RId 是主键的一部分,而不是语言。

我的问题是:为什么 NHibernate 看不到语言是主键的一部分?

谢谢你,卡塔林

0 投票
1 回答
1726 浏览

hibernate - 由于返回的列顺序,hibernate+postgres 中的复合 id 中断

我有一个具有复合 ID 的父对象(旧版数据库 - 无法修改它)。我有一个子对象,它是双向的一对多(父子)关系。映射是正确的,因为我可以加载任一实体的实例并正确导航关系。当我存储父级并将其级联到子级时,我的问题就出现了。Postgres 方言发出以下形式的查询:

“插入表名(column1,column2,column3,column4)值(value1,value2,value3,value4)返回*”

这是一个很好的 postgres 快捷方式,用于返回刚刚插入的行的所有值。但是,列以 db 设置的任意顺序返回,尽管它是包含所有列元数据的标准结果集。但是,postgres 似乎假设返回的列是按任意顺序排列的。

有问题的表有一个 btime 和 mtime 字段,它们通过插入时的触发器进行更新。两者都是时间戳列。这些是返回的前两列。我花了一段时间尝试调试休眠,但这是一个缓慢的过程。我相信正在发生的事情是第一个时间戳列被假定为生成的 id 列,并且在尝试将时间戳字符串转换为 Long 时失败。事实上,生成的 id 显示为第 4 列。

我相信这在某种程度上与使用复合键有关,因为我在另一个应用程序中为 btime 和 mtime 列使用了几乎相同的设置,该应用程序具有特定于休眠的模式,在任何地方都使用生成的长 ID。因为 btime 和 mtime 来自 db 中所有其他表都继承的父表,所以无法更改列的顺序。

最终结果是父插入和级联子插入都成功了,但是当休眠为子实体加载生成的字段失败后,它会抛出异常。这感觉很像hibernate中的一个错误,它让我感到寒冷。我希望有人知道解决方法或错误修复。

我正在使用 springsource 在最新 spring 3.0.1 版本的依赖包中分发的 hibernate-3.3.1-GA

版本实体和可审计实体定义如下:

最后,将以下存储过程设置为在两个表上插入之前执行,这就是 mtime 的更新方式。

所有这些功能,包括父表和用于更新 mtime 的存储过程都已在其他应用程序中使用。唯一的区别是父对象的复合键。

注意:我可以毫无困难地存储父对象而不引用子对象。如果我查看我的 sql 日志,我可以看到在这种情况下执行插入后,hibernate 会发出单独的选择 - 我认为这是级联保存与非级联保存之间的差异,或者复合主键和复合外键之间的差异。方言只在子对象上发出“插入...返回*”语法,无论我先保存父对象,然后在保存子对象之前添加子对象,还是让父对象级联到子对象,它都会执行此操作(或相反亦然)。

0 投票
3 回答
1039 浏览

c# - 为什么我不能使用部分父实体复合键引用子实体

我试图用部分父复合键而不是全部引用一些子实体,为什么不能?当我使用以下映射而不是注释的映射时,就会发生这种情况。

我收到以下错误

表 VolatileEventContent 中的外键必须与表 LocationSearchView 中引用的主键具有相同的列数

和 VolatileEventContent 映射文件