- Interceptor 介面: org.hibernate.Interceptor 介面允許您在 Hibernate 事件的各個階段介入,並提供了一些方法來實現您自己的邏輯。EmptyInterceptor 是 Interceptor 介面的一個簡單實現,它包含了所有方法的空實現。
- SessionFactoryObserver 介面: org.hibernate.SessionFactoryObserver 介面允許您觀察 SessionFactory 的生命週期事件,在 SessionFactory 創建、關閉等事件發生時執行自定義邏輯。
- EventListeners 介面: org.hibernate.event.service.spi.EventListenerRegistry 介面允許您註冊和管理 Hibernate 事件監聽器。您可以註冊自定義的事件監聽器來處理 Hibernate 事件,例如實體生命週期事件、持久化操作事件等。
- EventType 和 EventListener 介面: org.hibernate.event.spi.EventType 定義了 Hibernate 中的各種事件類型,org.hibernate.event.spi.PostInsertEventListener、org.hibernate.event.spi.PreUpdateEventListener 等介面定義了對應事件的監聽器介面。您可以實現這些介面來監聽特定的事件,在事件發生時執行自定義邏輯。
- Custom Type 和 User Type: org.hibernate.usertype.UserType 介面允許您定義自定義的數據類型,以便在實體類中使用。您可以實現這個介面來定義自己的數據類型,例如枚舉類型、自定義對象類型等。
- Custom Dialect: org.hibernate.dialect.Dialect 類允許您實現自定義的數據庫方言,以適配不同的數據庫。您可以擴展這個類,並實現數據庫相關的行為,例如數據類型映射、SQL 方言等。
- EntityInterceptor 介面: org.hibernate.Interceptor 介面的子介面,用於在實體加載、保存、更新等操作時執行自定義邏輯。
- AuditInterceptor 介面: 用於實現審計功能,記錄實體的創建、修改、刪除等操作。
範例程式
EntityIntercepto
package work.pollochang.pollo.grails.db.aop;
import org.grails.web.util.WebUtils;
import org.hibernate.EmptyInterceptor;
import org.hibernate.internal.EntityManagerMessageLogger;
import org.hibernate.internal.HEMLogging;
import org.hibernate.type.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import javax.sql.DataSource;
import java.io.Serializable;
/**
* 自訂攔截器
*/
public class CustomInterceptor extends EmptyInterceptor {
private static final EntityManagerMessageLogger log = HEMLogging.messageLogger( CustomInterceptor.class );
private DataSource dataSource;
public CustomInterceptor(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// String sessionId = org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes().getSessionId();
// System.out.println("sessionId = "+sessionId);
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().getRequest();
if (request != null) {
// 在这里访问 HTTP 请求对象,例如获取请求参数等
String parameterValue = request.getParameter("parameterName");
System.out.println("Parameter value from request: " + parameterValue);
String realIp = request.getRemoteAddr();
System.out.println("user IP = "+realIp);
}
// 获取数据库连接
Connection connection = null;
try {
connection = dataSource.getConnection();
// 执行Dummy SQL语句
executeDummySQL(connection);
} catch (SQLException e) {
log.error(e.getMessage());
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
log.error(e.getMessage());
}
}
}
return super.onSave(entity, id, state, propertyNames, types);
}
/**
* 查詢虛擬表
* @param connection
* @throws SQLException
*/
private void executeDummySQL(Connection connection) throws SQLException {
log.trace("executeDummySQL");
// 在这里执行Dummy SQL语句
Statement statement = connection.createStatement();
statement.execute("insert into test2(col1) values(0)");
statement.close();
}
}