比如 a类的一个属性是b类 双方无论是one-to-one 还是many-to-one 然后 unique="true"的情况下,都是先insert b类
但这样的情况下 有些逻辑讲不通 比如一个人的是一张表 名字是一张表 设计模型是肯定是一个人的一个属性是name 然后db中,肯定是人表是主键表,名字表是外键表 例子可能不恰当 假设用人可能没有名字。这样的话 先插入b类,就会出现一个外键约束不符合的情况。不知道怎么解决?先谢谢了
补充
不想在业务层里做两次操作 想通过映射文件做一次操作即可
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生成语句错误。。
建议看看书籍推荐:领域驱动设计与模式实战这本书。
帮你顶一下,我没用过这个,不能从这个角度去回答你的问题。哪位高人指点他一下吧~
这是设计思路问题、那员工与部门来说;员工跟部门的关系可以是 1:1,也可以是 n:1 ,每个员工都是属于一个部门的。再拿你举的例子来说“假设用人可能没有名字。这样的话 先插入b类,就会出现一个外键约束不符合的情况。”
这个不会出现外键不符合的情况吧, 除非你把名字做了表的主键了,但是这个情况不应该存在吧,名字肯定会有重复的。也就是说肯定会有个主键 ID 来标记吧。就算你先不晓得name ,但是插入一条记录肯定可以知道那条记录的ID的啊,ID 是唯一的,怎么会出现一个外键约束不符合的情况呢 ?
所以呢,先插入 B ,得到ID,赋给A 再插入A ,这个插入操作顺序是没错的。
这两个插入应该是在一个事物内的,会同时成功或者失败。
另外,你的理解有的偏颇,比如 A 类的一个属性是 B 类,如果 A 类对应到 A 表, B 类对应到 B 表,
那么 A 表中就会有个字段记录了 B 表中的主键,也就是说 B 表中的主键将作为 A 表中的外键来建立
A 表和 B 表之间的关系。因此,必须先插入 B 表以得到主键,然后再将其作为外键插入 A 表中。
也就是说名字表是外键表,但实际意义是指名字表的主键是人表的外键,那么在人表中插入数据前需要先得到
这个外键,那如何得到这个外键呢?那就得通过在名字表插入数据后得到的主键来作为人表的外键。