当前位置: 首页 > 面试题库 >

在ICollection的属性上拦截NHibernate持久性操作(许多关联)

倪举
2023-03-14
问题内容

我想对集合属性进行持久性操作,由我自己决定是否可以与数据库同步,并在确定一次持久性在所有集合上而不是每个元素上都发生持久性时调用一个过程。

怎么做 ?

这些集合属性通常使用一对多或多对多关联进行映射。所以,当我们有这样的事情:

myEntity.List.Add(new Item());
myEntity.List.Add(new Item());
...
session.Save(myEntity);

对于具有两个类(实体)和单向多对多关联的映射,我只希望发生两个sql语句:INSERT INTOPROCEDURE CALL,期望接收以逗号分隔的值列表,该列表是来自List上面的收藏。键集合只能保存在该系统上,该系统调用带有值列表(csv)的过程。

可以进行这种定制吗?


问题答案:

好吧,我采用了实现NHibernate侦听器的解决方案,所以我有一个像这样的侦听器:

public class CustomSaveUpdateEventListener : IPostInsertEventListener, IPostUpdateEventListener {

    private void ScheduleToCommit(AbstractPostDatabaseOperationEvent @event) {
        // Some filter
        if (@event.Entity.GetType().FullName.Equals(MY_ENTITY_TO_INTERCEPTS) {
            object o = @event.Entity;

            // Some logic...
            // ...
            // ...

            IQuery namedQuery = @event.Session.GetNamedSQLQuery(MY_NAMED_QUERY);
            //namedQuery.SetParameter(...); // <== You can set parameters
            //namedQuery.ExecuteUpdate(); // <== DO NOT EXCEUTE HERE, this launches more events recursively and can generate stackoverflow

            @event.Session.ActionQueue.RegisterProcess(new MyActionBeforeCommit(@event, namedQuery).SaveValuesOperation);
            }
        }
    }

    public void OnPostInsert(PostInsertEvent @event) {
        ScheduleToCommit(@event);
    }


    public void OnPostUpdate(PostUpdateEvent @event) {
        ScheduleToCommit(@event);
    }
}

而且我的对象MyActionBeforeCommit()被安排为仅在提交事务后才运行。因此,在我的“未来行动”中,我有:

public class MyActionBeforeCommit {
    private AbstractPostDatabaseOperationEvent e;

    private IQuery query;

    public MyActionBeforeCommit(AbstractPostDatabaseOperationEvent e, IQuery query) {
        this.e = e;
        this.query = query;
    }

    public void SaveValuesOperation() {
        // Here your query will be executed only when a transation is commited, if 
        // it's rolledback this won't be executed
        query.ExecuteUpdate(); 
    }
}

最后,我们需要在NHibernate配置上注册新的侦听器,如下所示:

Configuration.SetListener(ListenerType.PostInsert, new    CustomSaveUpdateEventListener());
Configuration.SetListener(ListenerType.PostUpdate, new CustomSaveUpdateEventListener());

而且效果很好。这是一个非常好的NHibernate功能,非常强大。



 类似资料:
  • 我使用springboot(2.1.9。RELEASE)和hibernate(5.4.6。最终)来开发程序,我需要懒加载一个字符串类型字段(更改日志),所以我使用了持久性属性截取表,字符串类型字段可以懒加载,但是ManyTo很多的连接表不起作用。这是代码 测试用例代码 运行测试用例后,数据被插入到类别和项目表中,但是joinTablecategory_items没有数据。如果项目不使用持久性属性属

  • HTML 元素包括标签名和若干个键值对,这个键值对就称为“属性”(attribute)。 <a href="http://www.example.com"> 链接 </a> 上面代码中,a元素包括两个属性:id属性和href属性。 属性本身是一个对象(Attr对象),但是实际上,这个对象极少使用。一般都是通过元素节点对象(HTMlElement对象)来操作属性。本章介绍如何操作这些属性。 E

  • 问题内容: 尝试将对象保存到数据库时遇到了以下错误。我尝试了here1和here2提到的解决方案,但是效果不好。我遵循的是一个教程,但唯一的区别是Spring和Hibernate的版本。 我可以直接使用SessionFactory持久化对象,但是如果我使用HibernateDaoSupport尝试使用此方法,它将失败并显示以下错误 spring.xml CustomerDAOImpl.java 使

  • 问题内容: 我对Java Quartz不太熟悉,我们只是使用了每天安排的测试工作。对于我们的Struts2 Web应用程序,我们希望运行一些计划在一天中不同时间的日常工作。作业应处于持久状态,以便即使由于服务器关闭/应用程序失败而导致作业失败,也应在服务器启动后稍后重新执行。我还可以将作业的状态/结果存储在DB中,以便监视作业。任何的意见都将会有帮助。 - 谢谢 问题答案: 无论您提到什么,都可以

  • 属性操作 HTML 属性与 DOM 属性的对应 每个 HTML 属性都会对应相应的 DOM 对象属性。 <div> <label for="username">User Name: </label> <input type="input" name="username" class="text" value=""> </div> input.id; // 'username

  • 我正在试用IntelliJ IDEA,它警告我一个我不太理解的冬眠协会。 一面: 为了检查一下精神状况,我看了这篇文章,也看了这篇文章。