NHibernate 多对多映射的数据更新 最近在用 NHibernate 做多对多更新时突然发现 NHibernate 更新的策略很差, 对多对多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪..., 再添加一个新的角色, NHibernate 生成的 SQL 语句如下(仅包含对关系表 User_Role 的操作): DELETE FROM [User_Role] WHERE [UserId] =..., 再添加一份新的进来, 完全无法接受, 反过来思考觉得肯定是自己的问题, 经过一番搜索 (Google), 发现 StackOverflow 上也有人问类似的问题, 并且最终在 NHibernate...Tip: Use set for many-to-many associations 发现了解决方案, 将多对多的映射的 bag 改为用 set , 问题终于得到了解决, 改过后的映射如下: Set(...不只是多对多, 如果你的集合需要更新, NHibernate 推荐的是: 19.5.2.
由于在项目中使用了NHibernate来作为ORMapping构建数据访问层,那么就必须要配置Object和DataTable的映射。...最早的项目中,我们使用了最传统的XML配置文件的方式编写映射关系,但是这样太麻烦,每次修改class和表时都要去修改对应的XML文件,而且还容易出错,一定有疏忽遗漏的地方,还不容易找出错误,所以在第二个项目中...使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。...我们只需要定义好映射的规则,就可以不对每个表和类分别编写映射配置,而是按照规则进行自动的Mapping工作。这样在修改class或者DataTable时,只需要修改类和表即可,不需要再修改配置文件。...比如我们可以定义如下的规则: 类名和字段名采用每个单词首字母大写的方式而数据库表名和列名使用全部大写,单词之间下划线分割的方式。
从个人感受上看,NHibernate显然是从上而下(Top-down)的方式,天然的POCO支持就是最好的佐证。...其实ORM和DP的存在就是要实现这两个方向的能力和支持,否则就没有存在的必要,因为自上而下(Top-down)和自下而上(Bottom-up)两种方式由来已久,解决这两个方向的问题,ORM工具或E/R模型编程未必是最好的方式...同样仔细想想Entity Framework(也许NHibernate也是)在从外向里(Outside-in)方向也提供了支持,这也就是Dsimmons为代表的EF大佬经常说的,Entity Framework... 不是简单的ORM工具,它主要是提供一个完全贴近现实的E/R模型,这个模型可以进行数据编程(DP),也可以建模和进行数据表现,最重要的是这个模型可以被共享和重用(目前比较成功的一个案例就是能被ADO.NET... Data Service 共享和重用),另外一个方面SQL Server的功能再逐渐增强以及新近的LINQ等数据库+DP的功能混杂和爆发,都在另外一个角度朝从下向上推进,这种情况下Mapping是可以限定在某些功能和场景的
开发过程中遇到如何在带有Hibernate注释的mysql中将Java日期映射到DATETIME(默认为TIMESTAMP)的问题如何解决?...下面主要结合日常开发的经验,给出你关于如何在带有Hibernate注释的mysql中将Java日期映射到DATETIME(默认为TIMESTAMP)的解决方法建议,希望对你解决如何在带有Hibernate...注释的mysql中将Java日期映射到DATETIME(默认为TIMESTAMP)有所启发或帮助; 问题描述 使用注释的columnDeFinition属性:@Column @Column(name =...我对2038的限制不满意,所以我希望endTime在mysql中为DATETIME类型。...类型的endTime字段的表来解决,而不是将实体endTime映射到该列,但是我希望Hibernate自动生成表-
学习和使用Nhibernate已经很久了,一直想写点东西和大家一起学习使用Nhibernate。博客园里也有很多大牛写了很多关于Nhibernate入门的文章。...本篇文章阅读对象是:Nhibernate初学者!如果你是Nhibernate的研究者或者已经很熟练的运用Nhibernate请不吝赐教,对本文不足之处进行指教。 带着问题去学习!...3、怎么搭建Nhibernate? 4、怎么使用Nhibernate? 好,我们就带着这几个问题开始我们的Nhibernate的旅程。 ...Nhibernate带给我们的就是:对于开发者通常的数据持久化相关的编程任务,解放其中的95%! 第三个问题: 这是本文的关键,是怎么搭建呢? ...第四个问题: 使用和测试你的配置【可以爽一把了!】
从个人感受上看,NHibernate显然是从上而下(Top-down)的方式,天然的POCO支持就是最好的佐证。...其实ORM和DP的存在就是要实现这两个方向的能力和支持,否则就没有存在的必要,因为自上而下(Top-down)和自下而上(Bottom-up)两种方式由来已久,解决这两个方向的问题,ORM工具或E/R模型编程未必是最好的方式...同样仔细想想Entity Framework(也许NHibernate也是)在从外向里(Outside-in)方向也提供了支持,这也就是Dsimmons为代表的EF大佬经常说的,Entity Framework... Data Service 共享和重用),另外一个方面SQL Server的功能再逐渐增强以及新近的LINQ等数据库+DP的功能混杂和爆发,都在另外一个角度朝从下向上推进,这种情况下Mapping是可以限定在某些功能和场景的...从上面的描述上可以很清楚的看出Entity Framework和NHibernate的区别,虽然他们都是ORM工具,他们在ORM的各个方向的侧重是不一样.
接着上一篇,今天我们说说ORM中的Mapping。如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的配置。...今天跟上一篇一样,会使用传统方式和 NHibernate 进行讲解。...如果你要亲手试验一下,可以先看一下“Fluent NHibernate之旅一”,进行一下数据库和SessionFactory的准备。...hbm.xml文件,自己再看一篇,看看NHibernate的映射方式,所以是非常好的一个方法,我有时候做映射的时候,遇到问题都会生成出来,随时查看问题所在,所以说是非常有用的一个方法,而且你可以把你的映射文件直接用到...这个答案我也不知道,至少我在解决的问题的时候,觉得Fluent方式比传统方式要方便一些,至少我们测试的时候,我不需要把映射文件,配置文件等重新到复制到测试项目中了,呵呵。
大家好,又见面了,我是你们的朋友全栈君。 一、NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。...NHibernate是一个面向.Net环境的对象/关系数据库映射工具。...NHibernate除了能将一张表映射为一个对象,还可以将表间关系变为对象的属性。例如学生和课程间的多对多关系就可以转化为学生类中的一个课程集合的属性。...由此可见,NHibernate不仅仅管理.Net类到数据库表的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...NHibernate知道如何完成ORM映射的XML文件; 5.使用NHibernate的API来编程 三、NHibernate的使用 1.
步骤3:编写映射文件(Mapping File) 现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件..."/> 让我们来看看这个有趣的映射文件:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user...让我们返回到"id" tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段...驱动,连接到本地的nhibernate数据库,并且使用提供的用户和密码.还会有其他的配置项,你可以参看文档....Configuration对象知道所有在.Net类和后端数据库之间的映射关系, Configuration cfg = new Configuration(); cfg.AddAssembly("NHibernate.Demo.QuickStart
Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence...Mapping 今天我们将说一下ORM中的R映射,我们现在的数据库大多都是关系型数据库了,所以可以说关系在我们数据库设计中也是非常重要的部分,NHibernate也非常重视这一块,但在传统方式中,配置就比较麻烦...够简单的吧,User和UserDetail是一对一关系,构建我们的实体类: public class User { public virtual int UserID { get; set; }...映射 Fluent NHibernate 映射代码: public class UserMap : ClassMap { public UserMap() {...今天说了关联中比较简单的一对一关系,其实一对一关系并不简单,第一次接触的时候,难免会遇到各种问题,很欢迎大家能留言,大家一起讨论问题。
NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。...第三步:写映射文件 现在我们有数据表和需要去映射它的.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。...最易于管理的办法是为每一个类写一个映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和类的同一个目录里,NHiberante将会使得事情简单起来。...第一个有趣的标签是class。这里我们将映射类型名称(类名,装配件)到我们数据库中的User表,这里和Hibernate有一点点的不同。你将不得不告诉NHibernate从何处提取对象。...的数据库,提供用户名和密码。
1.timestamp占用4个字节;datetime占用8个字节 2.timestamp范围1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999...;datetime是1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999 3.timestamp默认支持not null default CURRENT_TIMESTAMP...自动更新当前时间;datetime 在5.6版本后才支持,需要手动指定not null default CURRENT_TIMESTAMP 4.timestamp转成utc存储,查询再自动转回来;datetime...null auto_increment, email_id int unsigned not null default 0, update_date timestamp, create_date datetime...超过存储范围的时候 ?
大家好,又见面了,我是你们的朋友全栈君。 —-DATETIME 和SMALLDATETIME的内部存储与我们输入的或者显示的是完全不一样的。...具体的不多说了 —-看下面的演示 –1.datetime的内部存储 declare @dt datetime set @dt= current_timestamp —datetime在数据库中是以8字节存储的前...4个存储的是以1900-01-01为基准算出来的天—数,后4位存储的是午夜0点之后的时钟周期数,每个时钟周期是1/300秒,即3.33毫秒。...declare @sdt smalldatetime set @sdt= current_timestamp —smalldatetime 数据类型存储天的日期和时间,但精确度低于datetime。...数据库引擎将smalldatetime 值存储为两个2 字节的整数。 —第一个2 字节存储1900 年1 月1 日后的天数。另外一个2 字节存储午夜后经过的分钟数。
Python在处理与时间相关的操作时有两个重要模块:time和datetime。在本文中,我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。...datetime模块是Python中处理日期和时间的主要模块,它提供了日期和时间的表示和操作的类。主要包括: datetime类:表示一个具体的日期和时间,包括年、月、日、时、分、秒和微秒。...) datetime模块提供了更多的日期和时间操作。...time模块主要用于处理时间戳和一些基本的时间操作,而datetime模块提供了更丰富的日期和时间处理功能,包括日期时间对象的创建、比较、运算和格式化等。...我们要处理时间时可以根据不同的需求结合time和datetime模块,有效地处理Python程序中与时间相关的任务,从简单的时间测量到复杂的日期和时间操作。
步骤3:编写映射文件(Mapping File) 现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件...”/> 让我们来看看这个有趣的映射文件:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user...让我们返回到”id” tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段...驱动,连接到本地的nhibernate数据库,并且使用提供的用户和密码.还会有其他的配置项,你可以参看文档....Configuration对象知道所有在.Net类和后端数据库之间的映射关系, Configuration cfg = new Configuration(); cfg.AddAssembly(“NHibernate.Demo.QuickStart
对于Bidirectional的情况,那么在保存数据到数据库时就会涉及到一个问题,如果两边的数据不一致,也就是mismatch,到底是以Order中的Items为准还是以OrderItem中的Order...接下来举一个具体的例子,部门和员工,一对多关系,部门D1,D2,员工U1和U2,D1的Users里面有U1和U2,U1对象引用D1,U2对象引用D2。...比如有员工E1和E2,奖品A1和A2,其是多对多关系,如果要设置E1员工获得A1和A2奖,那么需要设置各自的集合: 1: Emp e1=new Emp(){Name = "E1"}; 2...但是生成SQL却有问题: 1: NHibernate: INSERT INTO EMP (NAME, EMP_ID) VALUES (@p0, @p1);@p0 = 'E1' [Type: String...语句,当然如果把C#代码中的6行和7行去掉,结果也是正确的,因为现在系统只认Emp中的Awards集合了。
Mapping 四、一对一映射:One-to-One Mapping 场景和数据库设计 延续我们的演示范例,用户和订单是非常典型的一对多范例。...我们原先的订单系统太贫血了,我们进一步扩展一下,现在已经可以储存收货人的姓名和地址,还包括了发起人的UserID。...映射 不得不赞叹一下 Fluent Nhibernate ,有了它,我们的映射一切都变得如此简单,先来看看Model吧,用户的订单列表,对于用户来说,暂时是不需要排序的,所以我们可以使用ISet作为Order...总结 总体来说,一对多的映射比较简单点,不过我们今天只是说了一般的情况,但如果我们遇到级联更新、级联删除等,就会遇到一些问题,在后续文章中会慢慢道来。...如果您在使用Fluent Nhibernate的时候也遇到了问题,可以及时与我联系或求助于Fluent 的Google Groups。 应“亦续缘”的要求,我把代码整理了下,发上来,便于大家学习。
经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型...、泛型、Lambde表达式等等Vs、Framework等特性简单完成映射工作,同时也能让我们学习NHibernate的映射方式,一举夺得,这么好玩的东东,有理由不继续完成这个系列吗?...,大家需要注意,子类的几个字段,最好设置成null,避免造成不能insert的问题。...,等一下你会知道,第一种策略和第二种策略都会采用这样的方式来进行映射,至于映射会使用subclass还好是join-subclass,FluentNHibernate会自动生成的。...还有几种混合方式,其实就是第一种和第二种的结合,这要看不同需求了,同时也可以结合上面两种映射方式完成,就不做介绍了。
大家好,又见面了,我是你们的朋友全栈君。 配置nhibernate的方式有两种,一种是通过xml文件的方式配置,还有就是通过class的方式配置。...网上大多数是以xml的方式配置nhibernate,本文则已class的方式来配置,并通过IOC(依赖注入,本文以构造注入)的方式注册nhibernate。...IocConfig.cs 用于注册nhibernate和service namespace Web.Ioc { public class IocConfig { public...如图: Web.Model:该项目先主要存放数据实体以及实体对应数据库的映射。即nhibernate的mapping。...SchemaMetadataUpdater.QuoteTableAndColumns(cfg); return cfg; } /// /// 通过Mapping映射的方式注册
TIMESTAMP和DATETIME的相同点: 1> 两者都可用来表示YYYY-MM-DD HH:MM:SS[.fraction]类型的日期。...TIMESTAMP和DATETIME的不同点: 1> 两者的存储方式不一样 对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。...而对于DATETIME,不做任何改变,基本上是原样输入和输出。...datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。...从MySQL 5.6.5开始,Automatic Initialization and Updating同时适用于TIMESTAMP和DATETIME,且不限制数量。
领取专属 10元无门槛券
手把手带您无忧上云