在实体管理器中获取连接时调用本机语句



我的公司正在使用数据库ONINSERT、ONUPDATE、ONDELETE触发器来记录更改,还有一种方法可以通过调用设置数据库会话参数的存储过程来模拟另一个数据库用户。然后,对该连接所做的任何更改都会自动分配给该用户。我知道这是一个糟糕的设计,但我无法改变。

现在,我需要确保在实体管理器将更改与数据库同步之前始终调用此存储过程,并且每次要模拟的用户都不同。我试着简单地将存储过程调用封装在一个无状态EJB中,并在对实体进行任何更改之前调用该EJB,但在某些情况下这是不起作用的——它的行为就像从未调用过该过程一样。我的猜测是,该过程是在与发布的更改不同的连接中调用的,尽管这应该发生在单个事务中。

有什么干净的方法吗?

您可以使用EntityListeners。这些必须放在你所有的实体上,所以如果你有很多,也许这不是一个好的解决方案。

否则,您可能需要一种特定于实现的方式:

  • Toplink:http://java-persistence.blogspot.com/2007/04/simple-auditing-using-toplink-jpa.html

  • 休眠:http://community.jboss.org/wiki/AuditLogging

  • EclipseLink:http://www.eclipse.org/forums/index.php?t=tree&th=165280&页面顶端

最新更新