我们在两个表之间拆分了一个用户对象,一个人表和一个用户表。
public UserMap()
{
Table("Person");
Id(x => x.PersonId, "PersonId");
Map(x => x.Name, "Name");
Join("User", s => {
s.Fetch.Join();
s.KeyColumn("PersonId");
s.Map(x => x.Username, "Username");
s.Map(x => x.Password, "Password");
});
}
在进行插入时,nHibernate 会先插入Name
到Person
表中,然后再Username
插入Password
到User
表中。
当插入User
-table 失败时会出现问题(例如尝试插入用户名已被占用的用户)。Person
事务失败,但不会回滚到表中的插入。
public User Save(User user)
{
var session = SessionHelper.GetCurrent();
using (var dbTransaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(user);
dbTransaction.Commit();
}
catch (Exception)
{
dbTransaction.Rollback();
throw;
}
}
return user;
}
我们的 SessionFactory 也设置了 Fluent NHibernate
public ISessionFactory BuildSessionFactory(string connectionString)
{
return Fluently.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(c => c.Is(connectionString))
.Provider<OracleDriverConnectionProvider>()
.Driver<OracleDataClientDriver>()
.ShowSql)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
.BuildSessionFactory();
}
我已将失败会话中的日志文件放在 gist中。实体在User
现实生活中稍微复杂一些,并且正在进行一些身份验证,因此日志文件希望与绘制的图片 1:1 匹配...