NHibernate:将对象插入集合
NHibernate: insert object to collection
我的 NHibernate 项目中有 2 个 类:OrderModel 和 OrderProductModel:
public class OrderModel
{
public OrderModel() { productList = new HashedSet<OrderProductModel>();}
(...)
public virtual ISet<OrderProductModel> productList { get; set; }
}
public class OrderProductModel
{
(...)
public virtual OrderModel orderM { get; set; }
}
我是这样映射的:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderModel">
<id name="id" column="id">
<generator class="native" />
</id>
<set name="productList" lazy="false" inverse="true" cascade="save-update" table="OrderProductModel" >
<key column="orderM"/>
<one-to-many class="OrderProductModel"/>
</set>
(...)
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderProductModel">
<many-to-one name="orderM" class="OrderModel" column="orderM"/>
(...)
</class>
</hibernate-mapping>
现在我想通过这样的方式向数据库插入订单:
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
session.Insert(order) // session is IStatelessSession and it must be
它向数据库中插入了订单,但是 table OrderProductModel 仍然是空的。我真的不想手动插入 orderProduct,我希望 NHibernate 可以为我做到这一点,但我不知道该怎么做。
你快到了。因为我们使用了 inverse="true"
我们必须设置关系的两边
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
// new lines
// these are essential part to make inverse mapping to happen
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
这是怎么回事?为什么要这样做?
因为设置 inverse="true" 我们说:NHibernate - 当你处理集合项目时 - 让它在这些项目上。他们会照顾 save/udpate。所以他们必须了解关系
如果我们调用
,一切都将与标准会话一起工作
session.Save(order);
session.Flush();
如果我们想使用无状态会话,我们应该知道:
13.2. The StatelessSession interface
Alternatively, NHibernate provides a command-oriented API that may be used for streaming data to and from the database in the form of detached objects. A IStatelessSession has no persistence context associated with it and does not provide many of the higher-level life cycle semantics. In particular, a stateless session does not implement a first-level cache nor interact with any second-level or query cache. It does not implement transactional write-behind or automatic dirty checking. Operations performed using a stateless session do not ever cascade to associated instances.
所以没有办法从我们确实有级联的事实中获利
要走的路是:
session.Save(order);
session.Save(p1);
session.Save(p2);
我的 NHibernate 项目中有 2 个 类:OrderModel 和 OrderProductModel:
public class OrderModel
{
public OrderModel() { productList = new HashedSet<OrderProductModel>();}
(...)
public virtual ISet<OrderProductModel> productList { get; set; }
}
public class OrderProductModel
{
(...)
public virtual OrderModel orderM { get; set; }
}
我是这样映射的:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderModel">
<id name="id" column="id">
<generator class="native" />
</id>
<set name="productList" lazy="false" inverse="true" cascade="save-update" table="OrderProductModel" >
<key column="orderM"/>
<one-to-many class="OrderProductModel"/>
</set>
(...)
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Shop.Domain.Model.Order" assembly="Shop.Domain">
<class name="OrderProductModel">
<many-to-one name="orderM" class="OrderModel" column="orderM"/>
(...)
</class>
</hibernate-mapping>
现在我想通过这样的方式向数据库插入订单:
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
session.Insert(order) // session is IStatelessSession and it must be
它向数据库中插入了订单,但是 table OrderProductModel 仍然是空的。我真的不想手动插入 orderProduct,我希望 NHibernate 可以为我做到这一点,但我不知道该怎么做。
你快到了。因为我们使用了 inverse="true"
我们必须设置关系的两边
var p1= new OrderProductModel{...};
var p2= new OrderProductModel{...};
var order = new OrderModel{...};
// new lines
// these are essential part to make inverse mapping to happen
p1.orderM = order;
p2.orderM = order;
order.productList = new HashedSet<OrderProductModel>{p1, p2} // from Iesi
这是怎么回事?为什么要这样做?
因为设置 inverse="true" 我们说:NHibernate - 当你处理集合项目时 - 让它在这些项目上。他们会照顾 save/udpate。所以他们必须了解关系
如果我们调用
,一切都将与标准会话一起工作session.Save(order);
session.Flush();
如果我们想使用无状态会话,我们应该知道:
13.2. The StatelessSession interface
Alternatively, NHibernate provides a command-oriented API that may be used for streaming data to and from the database in the form of detached objects. A IStatelessSession has no persistence context associated with it and does not provide many of the higher-level life cycle semantics. In particular, a stateless session does not implement a first-level cache nor interact with any second-level or query cache. It does not implement transactional write-behind or automatic dirty checking. Operations performed using a stateless session do not ever cascade to associated instances.
所以没有办法从我们确实有级联的事实中获利
要走的路是:
session.Save(order);
session.Save(p1);
session.Save(p2);