创建子对象的首选方法是什么?
我正在努力争取#1。而且我认为#2更为可取(不那么“神奇”)是很难的。
答案 0 :(得分:1)
不确定什么是“首选方法”(可能取决于谁更喜欢)。但我可以分享我的方式
如果父实体是根实体,那么我们应该一次性保存所有参考树:session.SaveOrUpdate(parent)
。
E.g。 Employee
包含Educations
的集合。在这种情况下,它应该像这样
Education
为员工提供参考,Add()
收藏集employee.Educations
。 xml:
中的一些片段<class name="Employee" table="..." lazy="true"
optimistic-lock="version" dynamic-update="true" batch-size="25" >
<cache usage="read-write" region="ShortTerm"/>
<id name="ID" column="Employee_ID" generator="native" />
<bag name="Educations" lazy="true" inverse="true"
batch-size="25" cascade="all-delete-orphan" >
<key column="Employee_ID" />
<one-to-many class="Education" />
</bag>
...
和教育
<class name="Education" table="..." lazy="true" batch-size="25>
<cache usage="read-write" region="ShortTerm"/>
<id name="ID" column="Education_ID" generator="native" />
<many-to-one not-null="true" name="Employee" class="Employee"
column="Employee_ID" />
...
流利地说:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
BatchSize(25)
...
HasMany(x => x.Educations)
.AsBag()
.BatchSize(25)
.LazyLoad()
.Cascade.AllDeleteOrphan()
.Inverse()
.KeyColumn("Employee_ID")
public class EducationMap : ClassMap<Education>
{
public EducationMap()
{
...
References(x => x.Employee, "Employee_ID")
.Not.Nullable()
...
现在是C#关系:
// business
var employee = ...;
var education = new Education
{
Employee = employee,
...
};
employee.Educations.Add(education);
// DAO
session.SaveOrUpdate(employee);
如果父级不是root,则只有一个关系(Employee
包含Subordinates
类型Employee
的集合,保持持久分隔< / p>