Java 将用户名添加到审核表

Java 将用户名添加到审核表,java,mysql,database,hibernate,Java,Mysql,Database,Hibernate,我有一个用户必须登录的web应用程序。我正在使用Hibernate将对象保存到MySQL数据库。在数据库中,我有一个触发器,当对对象执行插入/更新/删除操作时,它会将新记录插入审计表 DELIMITER $$ CREATE TRIGGER `trg_insert_Book` BEFORE INSERT ON Book FOR EACH ROW BEGIN INSERT INTO audit_book (AUDITTYPE,AUDITDATE,bookId, boo

我有一个用户必须登录的web应用程序。我正在使用
Hibernate
将对象保存到
MySQL
数据库。在数据库中,我有一个触发器,当对对象执行插入/更新/删除操作时,它会将新记录插入审计表

DELIMITER $$
CREATE TRIGGER `trg_insert_Book` BEFORE INSERT ON Book FOR EACH ROW
    BEGIN   
         INSERT INTO audit_book (AUDITTYPE,AUDITDATE,bookId, bookName, pages) VALUES ('I',NOW(), NEW.bookId, NEW.bookName, NEW.pages);
    END; $$
DELIMITER ;
从上面的触发器中可以看到,每当在
book
表上进行插入时,我都会在
audit\u book
表中插入一条新记录。插入是使用以下代码完成的

public void addNewBook(Book book) {
    Session session = sessionFactory.getCurrentSession();
    session.save(book); 
}
我有一个方法返回当前正在使用系统的用户

@ModelAttribute("username")
    public String getPerson(Principal principal) {
    return principal.getName();
}

我的问题是如何将此用户名传递到数据库,以便在不将用户名添加到Book对象的情况下将用户名添加到audit表中?

不,您不能这样做,因为数据库不知道有关识别应用程序用户的逻辑


可以考虑使用数据库触发器代替审计目的。在链接的示例中,您可以在第4节中看到如何实现您的目标。将用户名信息添加到每个修订版。

简而言之,您不能。触发器在RDBMS中运行,在应用程序上下文之外(保存诸如应用程序用户状态之类的重要信息),这就是为什么它们通常不适合生成审核日志的原因。最好在应用程序本身中执行审计(如果需要,仍然保存到数据库中),因为已经存在许多工具。也就是说,我认为应用程序可以在每个会话开始时设置一个MySQL,然后在触发器中访问它。。。但这很有可能出错(如果由于超时或网络错误而中断会话,并在不重新建立用户变量状态的情况下自动重新连接,会发生什么情况?)。