问题标签 [composite-key]
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.
java - 使用组合键进行高效的 HashMap 检索(从 2 个枚举构建)
我有 2 个枚举值表示到对象的映射,我(当前)使用 HashMap 建模,其中 2 个枚举值用作键,对象是值。
这是低效的,因为我正在为 Enum1.values() x Enum2.values() 的每个组合创建一个新的 CompositeKey(Enum1 enum1, Enum2 enum2)。
我想跳过新的 CompositeKey() 问题。
我目前想到的解决方案是计算来自 2 个枚举的数字表示,类似于int numericKey = enum1.ordinal() * 0xFFFF + enum2.ordinal();
但当我这样做时,map.get(numricKey)
我仍然会自动装箱到 Integer - 因此创建新实例。
一个完美的解决方案(IMO)将是 Map 实现(不必是通用的......)但我认为 java 不存在这样的解决方案。
另一个选项可能mapping = new Object[Enum1.values().length][Enum2.values().length]
是我将使用它进行查找,Object = mapping[enum1.ordinal()][enum2.ordinal()]
但这似乎有点过于“C'ish”。
无论如何,运行时性能是这里最重要的方面。
欢迎评论。
谢谢,马克西姆。
nhibernate - 在 NHibernate 的复合外键中使用复合主键的一部分
我们有一个相当大的数据库(约 200 个表),它几乎完全使用复合主键和复合外键,使用单个“基表”,每个其他表都从该基表继承其主键的一部分:
- Parent 有单列主键 ParentId
- Child具有复合主键(ParentId,ChildId)和外键ParentId
- Nephew 有复合主键(ParentId, NephewId),外键 ParentId 和外键(ParentId, ChildId)
等等。到目前为止,我们使用自己的 ORM 框架管理整个 shebang,但我们正在考虑使用 NHibernate,我已被分配学习(我已经下载了 v2.1.2)。
映射:儿童
侄子
如果您愿意,我也可以发布课程,为了简洁起见,我现在将省略它们(因为我将省略 Parent 的映射,因为它没有问题)。每个属性都是虚拟的,每个映射文件都是嵌入式资源,每个复合 Id 都有自己的覆盖 Equals 和 GetHashCode 的类。
问题是我无法保存 Nephew 的实例,通过一个简单的初始化new Nephew()
并传递给_session.Save()
,因为我得到一个System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
.
映射中唯一重复的列是ParentId
. 删除 中的many-to-one
映射Nephew
、中的set
映射Child
和所有相关属性一切正常。
我发现了几篇报告此异常的帖子,在我的情况下最合适的似乎是这个,这让我直觉我当前的架构对于 NHibernate 是不可行的。请告诉我我错了:-)
笔记:
- 我现在没有使用 Fluent,尽管它可能是一种选择,但我更喜欢先学习基础知识;
- 是的,我们意识到复合主键是一个很大的麻烦。这个数据库多年来经过了好几手,可能不是那么熟练的人,但在重构它之前,我们将数到 10 000
nhibernate - NHibernate:复合键多对一映射:无法解析属性(外键组件)
我希望任何人都可以提供帮助。我必须针对这个第三方数据库进行开发,我有点被他们蹩脚的设计所困扰。不过,我想使用 NHibernate,所以我将不得不跳过箍。
简而言之,这个“事件”表与“运输”表有关系。运输表有一个由字段“ID”和“FK_EventID”组成的复合主键,后者当然是指回事件记录。每个事件都指向运输表中的一个不同的记录,因此它实际上是一对一的关系。这两个字段都是Guids BTW。
尝试将其映射出来,这就是我创建类的方式(为简单起见,省略了其他数据字段):
和:
在映射文件中,我正在尝试这样做(请注意,我使用的是多对一):
和:
当我尝试运行它时,我收到以下异常消息:
NHibernate.QueryException:无法解析属性:FK_TransportationID:FcoLib.FcoEvent
我的第一个预感是字段名称可能存在拼写错误,但这并不成立。所以现在我完全感到困惑,不知道如何进行。任何帮助是极大的赞赏。谢谢。
更新
我想我找到了错误的根源。我还没有看过那里,因为我认为这是一个映射错误,但显然它是一个查询错误。它发生在我进行查询的地方:
我会进一步研究这个,但显然我需要以不同的方式查询这个......
java - 如何在复合键中使用生成的值?
我有两个具有多对一关系的类 documentlog 和 documentversion(主键:int doc_id 和 int docVersionID)。我使用了一个名为 CompundKey 的复合键类来管理复合主键。我需要自动增加 docversionID,但我不能这样做。你能在这方面帮助我吗?
hibernate - Hibernate 是否应该能够处理重叠的外键?
我有一个表,其中有两个外键指向两个不同的表,两个外键共享一列:
如您所见,有两个 FK 共享 country_code(巧合地在引用路径的末尾引用了同一列)。实体类看起来像(JPA 1.0 @IdClass):
如您所见,我将 countryCode 属性和城市的 country_code @JoinColumn 标记为只读(可插入 = 假,可更新 = 假)。Hibernate 因这句话而失败:
老实说,这对我来说看起来很基本。“不允许在属性中混合可插入和不可插入的列”是一个如此弱的“借口”,不是吗?
Hibernate 是否应该能够处理这个问题,例如根据 JPA 规范?这是一个错误吗?
entity-framework - 实体框架——级联删除复合键实体时,在主体对象之前未删除依赖对象
我在使用复合键级联删除依赖对象时遇到问题。具体来说,EF 发出的 SQL 指令会尝试在依赖实体之前删除主体实体。
我已经OnDelete="Cascade"
在我的 EF 模型的 CSDL 和 SSDL 中进行了设置,并将依赖实体显式加载到内存中,以便 EF 知道如何处理它们。我让这个与另一个 FK 关系正常工作,并且 EF 在删除原则之前正确删除了子实体。
但是,在这种情况下并非如此,我怀疑这是因为依赖实体具有复合键。简要看一下架构:
我希望在删除实体 A 时删除实体 A_B 的条目。
我可以查看 ObjectStateManager 并查看 A 的 A_B 实体加载到内存中并标记为删除,但 EF 在删除 A_B之前发出 SQL 命令来删除 A。当依赖实体有自己的 PK 时,这可以正常工作,但当它是复合键时似乎会出错。即使我明确告诉 EF 的 FK 协会(SSDL 和 CSDL)删除应该是级联的,它也不会首先删除子级。
同样,我将 A 及其 A_B 都加载到内存中,并且 ObjectStateManager 将它们全部标记为删除。我正在使用启用了代理创建的 POCO,尽管我通过针对 Context 的 LoadProperty 调用将子实体显式加载到内存中。
有人见过这个吗?复合键真的是问题还是只是分散注意力?为什么 EF 在一种情况下以正确的顺序处理 SQL 命令,而在另一种情况下则不然?
编辑:我已经阅读了 OnDelete ( http://msdn.microsoft.com/en-us/library/cc716734.aspx ) 和关系管理 ( http://msdn.microsoft.com/en-us/ ) 的文档库/ee373856.aspx)。题为“识别和非识别关系的注意事项”的部分似乎暗示我想要做的事情是可能的,而且确实是预期的。它可能是数据库的 EF 提供程序程序集中的东西吗?我正在使用 IBM.Data.DB2 程序集处理 Informix 数据库,而不是针对 SQL Server 数据库。
(进一步更新:我已更新到 IBM DB2 v9.7fp3a 和 EF Providers Beta Refresh -- http://www.ibm.com/developerworks/forums/thread.jspa?threadID=345634&tstart=0)
database - 查询数据库中复合键的属性之一
复合键包含两列:col1 和 col2。如果我只在 col1 上运行查询,会使用索引吗?为什么
我猜不是,因为通常索引是作为 B+ 树实现的。而在 B+ 树中,键存储在内部块中,所有记录都存储在树的最底层。如果我们从索引中进行查询,它可能效率不高或不可能。
jpa - JPA, Mixed surrogate key with foreign key and sequence number
I've got two tables:
Entries in the database might look like this:
Document:
Section:
Document
has a generated Id on DOC_ID, while Section
has a composite primary key over DOC_ID and SECTION_NUM.
SECTION_NUM is a locally(application) generated sequence number starting fresh for every document.
My entity classes look as follows:
When inserting a new Document and related Section, I do the following:
When persisting I get an exception stating that NULL is not allowed for column SECTION_NUM. I'm using OpenEJB (which relies on OpenJPA behind the scenes for unit testing), and found when stepping through OpenJPA code that it successfully persists the Document object, but when it comes to the Section object it creates a new instance reflectively and sets all fields to null, so losing the sectionNum value, before linking it to the Document object persisted earlier.
Unfortunately I can't change the DB schema, as it's a legacy system. Has anybody done something similar and got it working?
datanucleus - Datanucleus fetchgroup 组合键
我正在尝试在 datanucleus 中使用复合键映射一个类。主键由两个外键组成,我似乎无法在 fetchgroup 中包含这些外部类:
使用注释:
作品
作品
但
才不是。
我该怎么做?
oracle - 在 Nhibernate 中使用外键关系映射复合主键
我工作的一家公司正在使用 ERP,它的旧数据库是 Oracle。到目前为止,我一直使用包(oracle 存储过程)来访问数据,但这些年来这个数字一直在增长,现在我无法再管理它们了。
我试图用 Nhibernate 做一些实验,并开始映射几个表。
所有表都有复合主键。简要说明:
表顺序(表名:OCSAORH)
OCHORDN ( PK ) => OrderNumber
OCHAMND ( PK )
OCHCOSC ( PK ) => 公司
OCHCLII
...
表 OrderLine(表名:OCSALIN)
OCLORDN ( PK ) => OrderNumber
OCLAMND ( PK )
OCLCOSC ( PK ) => 公司
OCLLINN ( PK ) => 行号
OCLSSEQ ( PK )
OCLITMN
...
这是我的映射
订购:
订单行:
有了这些映射,一切正常;我可以加载订单,延迟加载会加载我的行。在阅读一些文档时,我注意到我没有定义多对一关系,所以我添加了这个:
到 OrderLine 映射文件。
现在,如果我运行我的测试应用程序,订单已正确加载,但未加载订单行。
我得到一个{NHibernate.ADOException} = {"could not initialize a collection: ... }
我试图调查并注意到生成的检索行的查询是错误的。这是 SQL:
如您所见,选择的最后 3 个字段(前缀为 OCH 而不是 OCL 的字段)不是 OCSALIN 表的成员;它们是 OCSAORH 的关键。
花了 1 天时间阅读文档和示例后,我无法弄清楚我做错了什么。
有没有人可以尝试帮助?