准备将公司的老应用迁移到OSGI karaf平台上。很吐血的一点就是hibernate。 这玩意,真是超级麻烦的一个工程。
classload是最头痛的一个问题。在Hibernate4上利用注册服务的方式 实现了 classloader的代理。
顺便提一句想用Hibernate3做reloadclass的同学们别妄想了。
除非是改源码。
01 | /** |
02 | * Rebuild hibernate session factory |
03 | * |
04 | */ |
05 | public static void rebuildSessionFactory() { |
06 | try { |
07 | // create a BootstarpRegistry |
08 | BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder() |
09 | // pass in a class-loader Hibernate should use to load application |
10 | // classes |
11 | .withApplicationClassLoader(org.postgresql.Driver. class .getClassLoader()) |
12 | // pass in a class-loader Hibernate should use to load |
13 | // resources |
14 | .withResourceClassLoader(HibernateSessionFactory. class .getClassLoader()).build(); |
15 |
16 | // create a ServiceRegistry |
17 | ServiceRegistryBuilder registryBuilder = new ServiceRegistryBuilder(bootstrapServiceRegistry); |
18 |
19 | // clear |
20 | configuration = new Configuration(); |
21 | // read config |
22 | URL u = HibernateSessionFactory. class .getClassLoader().getResource(configFile); |
23 | configuration.configure(u); |
24 | registryBuilder.applySettings(configuration.getProperties()); |
25 | // build ServiceRegistry |
26 | ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry(); |
27 |
28 | // create SessionFactory |
29 | sessionFactory = configuration.buildSessionFactory(serviceRegistry); |
30 | } catch (Exception e) { |
31 | System.err.println( "%%%% Error Creating SessionFactory %%%%" ); |
32 | e.printStackTrace(); |
33 | } |
34 | } |