首页 新闻 会员 周边

Nhibernate一对一情况下,插入如何自己控制顺序

1
悬赏园豆:100 [已解决问题] 解决于 2010-08-20 11:30

比如 a类的一个属性是b类 双方无论是one-to-one 还是many-to-one 然后 unique="true"的情况下,都是先insert b类
但这样的情况下 有些逻辑讲不通 比如一个人的是一张表 名字是一张表 设计模型是肯定是一个人的一个属性是name 然后db中,肯定是人表是主键表,名字表是外键表 例子可能不恰当 假设用人可能没有名字。这样的话 先插入b类,就会出现一个外键约束不符合的情况。不知道怎么解决?先谢谢了

补充

不想在业务层里做两次操作 想通过映射文件做一次操作即可

双鱼座的牛的主页 双鱼座的牛 | 初学一级 | 园豆:2
提问于:2010-08-19 10:16
< >
分享
最佳答案
0

a类的一个属性是b类

这两个类都是实体对象么,都有各自的生命周期么?关联有两种,其一是b类是个实体,他有自己的生命周期,有自己的状态。其二b类是个业务封装类,不是一个实体,他是个组件。组件是依附于a类的。

你说的:比如一个人的是一张表 名字是一张表 设计模型是肯定是一个人的一个属性是name 

这个Person类和Name类是不同的概念,name没有自己的生命周期,就是Person类的组件。所以是插入Person之后就插入了Name。

就像 http://www.cnblogs.com/lyj/archive/2008/10/23/1317877.html

对于关联关系关联引用对象的话,是先要有引用对象(Name),才能去关联他,你映射是把Name作为一个实体的,所以需要先保存Name,在保存Person的。

就像http://www.cnblogs.com/lyj/archive/2008/10/23/1317877.html Mapping篇的

所以是你映射错了,而不是NH生成语句错误。。

建议看看书籍推荐:领域驱动设计与模式实战这本书。

收获园豆:60
李永京 | 老鸟四级 |园豆:3114 | 2010-08-19 12:52
“领域驱动设计与模式实战 ”这本书 推荐 看原版的, 翻译的可读性差了点。
HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-19 12:55
中文版节约时间,知道大意就行了
李永京 | 园豆:3114 (老鸟四级) | 2010-08-19 12:58
刚看见 呵呵 先谢谢了 我先琢磨一下
双鱼座的牛 | 园豆:2 (初学一级) | 2010-08-19 13:52
其他回答(4)
0

帮你顶一下,我没用过这个,不能从这个角度去回答你的问题。哪位高人指点他一下吧~

收获园豆:10
sweetblue | 园豆:215 (菜鸟二级) | 2010-08-19 10:30
0

请教“李永京”...,有些专长高手不来这里。

收获园豆:10
Astar | 园豆:40805 (高人七级) | 2010-08-19 10:37
0

这是设计思路问题、那员工与部门来说;员工跟部门的关系可以是 1:1,也可以是 n:1 ,每个员工都是属于一个部门的。再拿你举的例子来说“假设用人可能没有名字。这样的话 先插入b类,就会出现一个外键约束不符合的情况。”

这个不会出现外键不符合的情况吧, 除非你把名字做了表的主键了,但是这个情况不应该存在吧,名字肯定会有重复的。也就是说肯定会有个主键 ID 来标记吧。就算你先不晓得name ,但是插入一条记录肯定可以知道那条记录的ID的啊,ID 是唯一的,怎么会出现一个外键约束不符合的情况呢 ?

所以呢,先插入 B ,得到ID,赋给A 再插入A ,这个插入操作顺序是没错的。

收获园豆:10
HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-19 11:10
不好意思 我的例子可能有问题 我表达的可能有问题 我的设计是这样的 为了在表中体现一对一的关系 name表的id即是主键又是外键 用的是assigned 因为A是B的属性 那么 肯定是B依赖于A 不可能反了 也就是 我想先插入A A是人员表 必须先有人 才可能有名字 然后把A的id赋给B 但nhb生成sql的顺序是相反的 不知道可以不
支持(0) 反对(0) 双鱼座的牛 | 园豆:2 (初学一级) | 2010-08-19 11:47
“我想先插入A A是人员表 必须先有人 才可能有名字 然后把A的id赋给B 但nhb生成sql的顺序是相反的”这句话,应该理解成:人是由名字、性比等等其他信息组成;也就是说,“人”这个表A保存了“名字”这个表B 的外键NameID; 也就是说要先添加到B表,得到记录ID,再把ID赋给A.NameID,这样 “人”这个表就保存了“名字”这个表的信息了。那也就是说,nhb要先生成 添加 B的SQL语句,再生成添加 A 的SQL 语句。nhb生成sql的顺序是对的。
支持(0) 反对(0) HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-19 12:23
0

这两个插入应该是在一个事物内的,会同时成功或者失败。

另外,你的理解有的偏颇,比如 A 类的一个属性是 B 类,如果 A 类对应到 A 表, B 类对应到 B 表,

那么 A 表中就会有个字段记录了 B 表中的主键,也就是说 B 表中的主键将作为 A 表中的外键来建立

A 表和 B 表之间的关系。因此,必须先插入 B 表以得到主键,然后再将其作为外键插入 A 表中。

也就是说名字表是外键表,但实际意义是指名字表的主键是人表的外键,那么在人表中插入数据前需要先得到

这个外键,那如何得到这个外键呢?那就得通过在名字表插入数据后得到的主键来作为人表的外键。

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2010-08-19 11:16
对 我就是在一个事物中呀 但事物内的语句也是有先后顺序的吧 您说的也对 我也了解这个 但是 我不想用独立字段记录 因为那样会被理解为一对多的关系 我想先插入A表(主实体) 得到Id,将Id赋给B表(A实体的属性)然后插入B表 不知道可以实现不?
支持(0) 反对(0) 双鱼座的牛 | 园豆:2 (初学一级) | 2010-08-19 11:52
你要这么实现的话,那A,B两个表的引用关系就的反过来才行。反正只要保证被引用的表的记录先插入(因为要获取插入的记录ID)、引用表的记录后插入就可以。
支持(0) 反对(0) HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-19 12:53
@双鱼座的牛:你是要让A表的主键也作为B表的主键吗?这样的话,在关系数据库中根据关系数据库范式,A 表和 B 表不存在关联关系。只有外键才能将 A 表和 B表联系起来。因此,你只能在代码中去执行先保存 A 表,后保存 B表。你可以将这两个操作放在一个事务中,以确保状态一致。
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-19 13:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册