使用Hibernate/JPA在运行时设置密码

3

我有一个web应用程序,其中在persistence.xml中定义了数据库连接属性。

我正在使用包含管理器持久性,并使用@PersistenceContext注入的实体管理器。

今天,DB的密码在persistence.xml文件中,但我宁愿在运行时设置它(向用户询问)。

我能够使用运行时密码创建新的EntityManager,但是如何“覆盖”已注入的EntityManager呢?

还有其他好的想法/方法吗?


与其明确地询问用户,最好使用属性或环境变量。 - chrylis -cautiouslyoptimistic-
客户端将在“本地”运行,而不是安装在适当的生产环境中,我们不希望在本地文件中存储生产密码。他们知道要向数据库使用什么密码,并将在运行时提供它。 - Ziggy000
1个回答

0

是的,这个有点担心为不同环境配置配置文件。

虽然它不能满足您对密码和替换对象的“运行时”设置,但它将作为Spring Bean配置文件进行维护。

就像这样;

@Configuration
@Profile("dev")
public class StandaloneDataConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.HSQL)
            .addScript("classpath:com/bank/config/sql/schema.sql")
            .addScript("classpath:com/bank/config/sql/test-data.sql")
            .build();
    }

}

假设您想要加载生产环境的配置文件?

您需要使用@Profile("production")定义另一个配置文件,并从类路径位置加载属性文件。

使用Spring Boot,您可以激活您的配置文件:

SPRING_PROFILES_ACTIVE=production mvn spring-boot:run

这样可以让您在需要时更改密码并重启服务器。无论如何,当您更改密码时,连接都需要重新启动。因此,理想情况下,这应该使工作变得更加容易。


1
我认为这有点偏题了。问题不在于拥有多个环境,而在于如何将容器管理的持久性与在应用程序已经运行时提供密码相结合。 - Ziggy000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接