在带有Id()的实体上使用级联.GeneratedBy.Assigned()

时间:2012-12-07 11:38:07

标签: hibernate nhibernate cascade

来自NHibernate docs:

  

由于其固有的性质,使用此生成器的实体不可能   通过ISession的SaveOrUpdate()方法保存。相反,你必须   如果要保存对象,则明确指定NHibernate   通过调用的Save()或Update()方法更新   的ISession。

好的,所以当这些实体是另一个实体的子节点时,你想要使用级联,这样当父节点被保存时,它的子节点也会被持久化,我们怎么能认为我们应该选择Save或者Update

我是应该把我的聚集根吹走并开始拯救个别孩子?在框架中覆盖这个有多难?当我离开crapper时,我不应该关掉灯,它应该是我想的自动。

1 个答案:

答案 0 :(得分:0)

这可能会产生轻微且不完全令人反感的副作用。

如果我们使用VersionUnsavedValue配置,我们可以再次使用SaveOrUpdate()我们的实体和级联按预期工作。

但是,因为版本值是在db-side处理的,所以NH必须再次调用以检索最新版本(在我的例子中是时间戳)。

我更喜欢聚集根处理孩子的保存,所以它对我有用。

...

public virtual byte[] Version { get; set; }

...

mapping.Version(m => m.Version)
.UnsavedValue(null)
.CustomSqlType("timestamp")
.CustomType("BinaryBlob")
.Generated.Always();