NHibernate Issues之1255:联合主键(composite-id)
来源:互联网 发布:淘宝首页图片轮播尺寸 编辑:程序博客网 时间:2024/05/16 05:05
这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。
这次看看联合主键(composite-id)。
有时建模需要,需要把几个属性组合了一个标识符,就用到了联合主键(composite-id),我们使用它,就难免遇到了一些问题,比如如何映射,如何等同性比较,如何查询等操作。
1.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(); }}
- NHibernate Issues之1255:联合主键(composite-id)
- NHibernate composite-id联合主键配置
- NHibernate composite-id联合主键配置
- hibernate 联合主键 composite-id
- hibernate 联合主键 composite-id
- hibernate 联合主键 composite-id
- Hibernate3.2(10):联合主键<composite-id.../>
- hibernate里联合主键composite-id映射
- hibernate里联合主键composite-id映射,查询单个主键的问题(转)
- NHibernate之 composite-element
- 联合主键配置时忽略的问题composite-id class must implement Serializable
- hibernate,复合主键,composite-id
- Hibernate中id的table生成策略之联合主键
- Hibernate之ID生成策略—联合主键
- Fluent NHibernate联合主键的使用
- hibernate ID联合生成主键
- hibernate ID联合生成主键
- NHibernate: 复合主键 (Composite Key) 如何兼容 NULL值
- Casting转型II
- 第十四周实验报告(二)
- PHP分页类
- IT工资大调查
- Velocity Tools 2.0 的 ResourceTool 用起来挺爽
- NHibernate Issues之1255:联合主键(composite-id)
- ExtJs4 笔记(10) Ext.tab.Panel 选项卡
- ORACLE 启动三步
- 要进入一个行业,怎样去了解一个行业的发展状况和发展趋势
- 如何在在MapX中画线
- C++是如何利用虚函数实现多态性的?
- IAR for 51 设置产生 hex 文件.
- 坑爹的sQL Server 2008 R2审核功能
- TFS强制撤销用户的签出