package hibernate1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.List;
import javax.sql.DataSource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.dialect.MySQLDialect;
import com.mysql.cj.jdbc.MysqlDataSource;
public class Hibernate1 {
private static DataSource initDataSource() {
MysqlDataSource ds = new MysqlDataSource();
ds.setUrl("jdbc:mysql:);
ds.setUser("root");
ds.setPassword("password");
return ds;
}
private static DataSource instrumentDataSource(final DataSource ds) {
return (DataSource) Proxy.newProxyInstance(Hibernate1.class.getClassLoader(), new Class[] { DataSource.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("::" + method.getName());
if (!method.getName().equals("getConnection")) {
return method.invoke(ds, args);
} else {
final Connection c = (Connection) method.invoke(ds, args);
return (Connection) Proxy.newProxyInstance(Hibernate1.class.getClassLoader(), new Class[] { Connection.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(":::" + method.getName());
return method.invoke(c, args);
}});
}
}
});
}
private static SessionFactory initHibernate(DataSource ds) {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.applySetting("hibernate.connection.datasource", ds)
.build();
Metadata metadata = new MetadataSources(standardRegistry)
.addAnnotatedClass( User.class )
.getMetadataBuilder()
.build();
return metadata.getSessionFactoryBuilder().build();
}
public static void main(String[] args) throws Exception {
DataSource ds = instrumentDataSource(initDataSource());
SessionFactory sf = initHibernate(ds);
Session session0 = sf.openSession();
System.out.println("# before begin()");
session0.getTransaction().begin();
System.out.println("# after begin()");
List result = session0.createQuery("from User").getResultList();
System.out.println("# before commit()");
session0.getTransaction().commit();
System.out.println("# after commit()");
session0.close();
}
}