news 2026/7/6 3:48:45

NHibernate Issues之1255:联合主键(composite-id)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NHibernate Issues之1255:联合主键(composite-id)

.Domain

这里定义一个Domain——CustomerValue,这个持久化类有两个属性:联合主键(composite-id)和Value。

我们使用联合主键,首先需要定义联合主键的类型,同时这个类必须重载Equals()和GetHashCode()方法,来实现组合的标识符等同性判断。 例如下面的CustomerValue持久化类,其联合主键类型为CustomerValueId,就是Customer持久化类与int类型的复合形式,在CustomerValueId类中重载了Equals()和GetHashCode()方法。

public class Customer { public virtual int Id { get; set; } public virtual string Name { get; set; } } public class CustomerValue { public virtual CustomerValueId Id { get; set; } public virtual decimal Value { get; set; } } public class CustomerValueId : IEquatable<CustomerValueId> { private int? _requestedHashCode; public Customer Customer { get; set; } public int CustomKey { get; set; } public bool Equals(CustomerValueId other) { if (ReferenceEquals(null, other)) { return false; } if (ReferenceEquals(this, other)) { return true; } return Equals(other.Customer, Customer) && other.CustomKey == CustomKey; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { return false; } if (ReferenceEquals(this, obj)) { return true; } if (obj.GetType() != typeof(CustomerValueId)) { return false; } return Equals((CustomerValueId)obj); } public override int GetHashCode() { if (!_requestedHashCode.HasValue) { unchecked { _requestedHashCode = ((Customer != null ? Customer.GetHashCode() : base.GetHashCode()) * 397) ^ CustomKey; } } return _requestedHashCode.Value; } }

2.Mapping

需要对两个Domain映射,这里注重理解下联合主键的映射,这里是把类的Customer属性和CustomerKey属性组合成为标识符属性。<key-many-to-one>节点用于映射子元素,一般都是Domain(多对一关系的);<key-property>节点用于映射属性。在这里我需要在<key-many-to-one>节点中设置not-found attribute来避免在运行时抛出异常,就是设置not-found="ignore"。

<class name="Customer"> <id name="Id"> <generator class="hilo" /> </id> <property name="Name" /> </class> <class name="CustomerValue" > <composite-id name="Id" class="CustomerValueId"> <key-many-to-one name="Customer" column="CustomerId" not-found="ignore" /> <key-property name="CustomKey" /> </composite-id> <property name="Value" /> </class>

3.Test

做完了上面的步骤,测试一下,保存一个CustomerValue。查询验证下并删除。这个测试很简单,就不贴出SQL结果了。

using (var session = OpenSession()) { using (var tx = session.BeginTransaction()) { var customer = new Customer { Name = "李永京" }; session.Save(customer); var customerValue = new CustomerValue { Id = new CustomerValueId { Customer = customer, CustomKey = 20012 }, Value = 1255.0m }; session.Save(customerValue); tx.Commit(); } using (var tx = session.BeginTransaction()) { var customerValue = session.CreateQuery("from CustomerValue c where c.Value=:value") .SetDecimal("value", 1255.0m) .UniqueResult<CustomerValue>(); session.Delete(customerValue); session.Delete("from Customer"); tx.Commit(); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 3:43:44

4层PCB接地层布局:模拟/数字地分割 vs 统一地平面实测EMI

4层PCB接地层布局&#xff1a;模拟/数字地分割与统一地平面的EMI性能实测分析在高速数字电路与精密模拟电路共存的现代电子系统中&#xff0c;接地设计始终是PCB工程师面临的核心挑战。传统教科书常简单建议"将模拟地与数字地分开"&#xff0c;但实际工程中这种一刀切…

作者头像 李华
网站建设 2026/7/6 3:40:17

AUC与ROC曲线:模型排序能力的量化评估方法

1. 项目概述&#xff1a;为什么AUC和ROC曲线是模型评估的“黄金标尺”在机器学习项目落地的最后一百米&#xff0c;真正决定模型能否上线、能否被业务方信任的&#xff0c;往往不是训练时漂亮的准确率&#xff0c;而是它在真实场景中“分辨好坏”的稳健能力。我做过二十多个风控…

作者头像 李华
网站建设 2026/7/6 3:39:17

PCB布局3大常见误区解析:从BGA阴影效应到40mil间距的工程取舍

PCB布局3大常见误区解析&#xff1a;从BGA阴影效应到40mil间距的工程取舍在硬件工程师的日常工作中&#xff0c;PCB布局往往是最容易被低估却又最影响最终产品性能的环节。许多初学者在完成原理图设计后&#xff0c;常常迫不及待地将元器件"塞"进电路板&#xff0c;却…

作者头像 李华
网站建设 2026/7/6 3:38:23

三十多个 AI Agent,谁已经凉了

2026 年&#xff0c;写代码这件事真正变的&#xff0c;不是哪个工具又强了一截&#xff0c;而是「人和机器怎么一起干活」这套规则&#xff0c;整个换了逻辑——从替你写代码&#xff0c;到替你办事&#xff1b;从一个个被动的工具&#xff0c;到一支支自己会跑的 Agent。 我把…

作者头像 李华
网站建设 2026/7/6 3:37:34

node-宠物领养平台项目源码(管理端+用户端)

最近用node 框架写了一个宠物领养平台&#xff0c;管理端和用户端。 宠物领养平台是一个前后端分离的Web应用系统&#xff0c;采用经典的B/S架构设计。系统包含三大核心模块&#xff1a;后端API服务、用户端前台和管理端后台。后端基于Node.js和Express框架构建RESTful API&…

作者头像 李华
网站建设 2026/7/6 3:37:28

05-服务端渲染与元框架——12. Gatsby - 静态站点生成

12. Gatsby - 静态站点生成 概述 Gatsby 是一个基于 React 的静态站点生成器&#xff08;SSG&#xff09;&#xff0c;它从数据源&#xff08;Markdown、CMS、API&#xff09;获取内容&#xff0c;在构建时生成静态 HTML 文件&#xff0c;提供极快的页面加载速度和优秀的 SEO…

作者头像 李华