微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与NHibernate一起使用“已分配” ID

如何解决与NHibernate一起使用“已分配” ID

| 我有两个实体,即Job和Language,处于多对一关系。这些实体的映射配置如下:
public class JobMap : ClassMap<Job>
{
    public JobMap()
    {
        Table(\"\\\"JOB\\\"\");
        LazyLoad();            
        Id(x => x.Id,\"id\").GeneratedBy.HiLo(\"hilo\",\"hilo_job\",\"50\");
        Map(x => x.Name).Column(\"name\").Unique();
        References<Language>(x => x.sourceLanguage,\"fk_id_language\").Cascade.None();
    }
}

public class LanguageMap : ClassMap<Language>
{
    public LanguageMap()
    {
        Table(\"\\\"LANGUAGE\\\"\");
        LazyLoad();                        
        Id(x => x.Id,\"id\").GeneratedBy.Assigned().UnsavedValue(0);            
        Map(x => x.Code).Column(\"code\");
    }
}
我使用此代码将作业添加数据库
private IServiceOperationResult AddJob(string jobName,Language sourceLanguage)
{    
    try
    {
        ISession session = sessionBuilder.GetSession();
        using (ITransaction transaction = session.BeginTransaction(System.Data.IsolationLevel.Serializable))
        {
            job = new Job(jobName,sourceLanguage);
            jobRepository.Add(job);
            transaction.Commit();
        }
    }
    catch (Exception e)
    {
        log.Error(\"Error adding job to the DB\",e);
        return new StringServiceOperationResult(e);
    }

    return new OkOperationResult();
}
JobRepository.Add(作业作业)很简单
public void Add(Job entity)
{
    SessionBuilder.GetSession().Save(entity);
}
问题是在NHProfiler开启的情况下运行此代码,我可以在插入到JOB表之前看到以下警告:   警告:   无法确定分配了标识符47的en-GB是暂时的还是已分离;查询数据库。在会话中使用显式的Save()或Update()可以防止这种情况。 然后从LANGUAGE表中进行(不必要的)SELECT,以加载ID为47的Language实体(其中\“ en-GB \”是Job.sourceLanguage对象的代码)。 就我而言,我不想从数据库中更新,插入或删除Language实体(在从其他实体中引用它的情况下),它实际上是不可变的表,始终填充有正确的行。有没有办法告诉NHibernate从我这里取走语言,并在插入到JOB表中时使用它的Id属性,而不管它是否存在于数据库中? 当我在将作业添加到存储库之前添加此行时
job.sourceLanguage = session.Load<Language>(sourceLanguage.Id);
我再也不会收到警告或SELECT信息,但是在与Language实体一起工作的任何地方执行此操作都比较麻烦。 非常感谢你。     

解决方法

        一个选择是使用拦截器类!覆盖OnSave方法添加此
job.SourceLanguage = session.Load<Language>(sourceLanguage.Id);
当实体为“职位”时。这样,您不必在所有地方都执行此查询。 例如看这里: NHibernate IInterceptor示例实现     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?