休眠 5 和 JPA 并动态设置实体类加载器
hibernate 5 and JPA and setting entity classloader dynamically
我有一个 Web 应用程序使用带有 'CompilingClassLoader' 的库,当它重新加载时(因为有人编辑了代码),每次都会创建一个新的类加载器。发生这种情况时,将执行我正在编写的休眠插件中的以下代码
@Singleton
@Provides
public EntityManagerFactory providesSessionFactory() throws IOException {
log.info("Loading Hibernate. ENTITY classloader="+entityClassLoader+" hibernate classloader="+this.getClass().getClassLoader());
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.classLoader.application", entityClassLoader);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnit, properties );
log.info("Done loading Hibernate");
return factory;
}
出现这个问题是因为我认为 "hibernate.classLoader.application" 必须改为在 persistence.xml 中定义(这违背了我需要的目的,因为每次开发人员更改代码时都会发生这种情况)。
基本上,我们有一个开发模式,其中 CompilingClassLoader 不断变化(它也非常快,所以效果很好)但我现在不知道如何在休眠状态下执行此操作。有没有办法通过 Thread.current.setContextClassLoader() 中的某些 ThreadLocal 或以某种方式设置它。
谢谢,
院长
这最终成功了
Collection<ClassLoader> classLoaders = new ArrayList<>();
classLoaders.add(entityClassLoader);
Map<String, Object> properties = new HashMap<>();
properties.put(AvailableSettings.CLASSLOADERS, classLoaders);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnit, properties );
我有一个 Web 应用程序使用带有 'CompilingClassLoader' 的库,当它重新加载时(因为有人编辑了代码),每次都会创建一个新的类加载器。发生这种情况时,将执行我正在编写的休眠插件中的以下代码
@Singleton
@Provides
public EntityManagerFactory providesSessionFactory() throws IOException {
log.info("Loading Hibernate. ENTITY classloader="+entityClassLoader+" hibernate classloader="+this.getClass().getClassLoader());
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.classLoader.application", entityClassLoader);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnit, properties );
log.info("Done loading Hibernate");
return factory;
}
出现这个问题是因为我认为 "hibernate.classLoader.application" 必须改为在 persistence.xml 中定义(这违背了我需要的目的,因为每次开发人员更改代码时都会发生这种情况)。
基本上,我们有一个开发模式,其中 CompilingClassLoader 不断变化(它也非常快,所以效果很好)但我现在不知道如何在休眠状态下执行此操作。有没有办法通过 Thread.current.setContextClassLoader() 中的某些 ThreadLocal 或以某种方式设置它。
谢谢, 院长
这最终成功了
Collection<ClassLoader> classLoaders = new ArrayList<>();
classLoaders.add(entityClassLoader);
Map<String, Object> properties = new HashMap<>();
properties.put(AvailableSettings.CLASSLOADERS, classLoaders);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnit, properties );