如何在Tomcat中在运行时创建hibernate.properties文件

时间:2014-05-01 05:40:38

标签: java hibernate tomcat

我有一个网络应用程序,它使用第三方提供的jar中包含的servlet。 servlet使用hibernate.properties来配置与数据库通信所需的dB设置。

这对我们来说是个问题,因为每个环境的文件必须不同。我已经尝试创建模板文件并在上下文启动时生成真实文件。

文件生成有效,但应用程序在创建后无法找到该文件。如果我重新启动tomcat,应用程序可以运行,因为该文件从上次启动时就已存在。

我不确定我是否在这个上与java或Tomcat作斗争,但我想知道为什么它无法在类路径中找到新创建的文件。

我一直在搜索实际加载此文件但无法发现它的hibernate代码。看到它的加载方式可能会给我一些线索。

我的文件生成器如下:

public class HibernatePropertiesFileGenerator implements ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware {
    private static final Logger LOGGER = LoggerFactory.getLogger(HibernatePropertiesFileGenerator.class);

    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        LOGGER.info("Generating hibernate.properties file.");
        Configuration configuration = new Configuration();
        configuration.setClassForTemplateLoading(this.getClass(), "/");
        configuration.setDefaultEncoding("UTF-8");
        configuration.setIncompatibleImprovements(new Version(2, 3, 20));

        Map<String, Object> freemarkerDataModel = Collections.singletonMap("env", (Object) context.getEnvironment());

        try {
            URL url = this.getClass().getResource("/hibernate.properties.ftl");
            File templateFile = new File(url.getFile());
            File outputFile = new File(templateFile.getParentFile(), "hibernate.properties");
            Template template = configuration.getTemplate("hibernate.properties.ftl");
            FileWriter fileWriter = new FileWriter(outputFile);
            template.process(freemarkerDataModel, fileWriter);
        } catch (Exception e) {
            throw new RuntimeException("Unable to create hibernate.properties file.", e);
        }
        LOGGER.info("hibernate.properties file generated.");
    }
}

1 个答案:

答案 0 :(得分:0)

生成模板不起作用,因为hibernate实际上在org.hibernate.cfg.Environment的静态类初始化器中读取hibernate.properties。到我的文件创建时,这段代码已经运行了。

我通过模板化hibernate.cfg.xml文件并放弃hibernate.properties文件解决了这个问题。