需要使用数据库用户名和&amp ;;登录Hibernate。密码动态

时间:2015-09-14 09:07:47

标签: java spring hibernate

有点像这个链接描述: Programmatically configure Hibernate with dynamic username and password

只是, 我需要相同的实现,但我无法指定applicationContext.xml而不是hibernate.cfg.xml,因为我的应用程序在applicationContext.xml内的dataSource中指定了hibernate属性 像这样

<bean id="dataSourceShrms" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@192.168.100.155:1546:TSHRMS" />
    <property name="username" value="${database.username}" />
    <property name="password" value="${database.password}" />
</bean>

编辑: 通过Java(直接来自Web应用程序UI)使用JDBC登录conn=DBUtils.getConnection(user, pass, host)之类的东西,但使用 Hibernate

2 个答案:

答案 0 :(得分:0)

想象一下,您在同名变量中拥有数据库 url driverClassname 用户名密码 。在您的情况下,这些变量将从输入页面或用户生成该数据的任何位置填充。

你有一个 MyClass 使用Hibernate注释配置 在包 com.myapplication.POJO

因此,您只需创建Configuration对象并查询数据库:

Configuration configuration = new Configuration().configure()
            .setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle8iDialect")
            .setProperty("hibernate.connection.driver_class", driverClassname)
            .setProperty("hibernate.connection.url", url)
            .setProperty("hibernate.connection.username", username)
            .setProperty("hibernate.connection.password", password)

//In next line you just tell Hibernate which classes are you going to query
configuration = configuration.addPackage("com.myapplication.POJO").
                addAnnotatedClass(MyCustomClass.class);
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(ssrb.build());

//We open session with database
Session session = factory.openSession();

List<MyCustomClass> result = null;
try {
    //Here we get the list of MyCustomClass objects from database
    result = session.createQuery("FROM MyCustomClass").list();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    session.close();
}

重要:我认为 Oracle8iDialect 是Oracle DB最常见的。如果您使用的是 Oracle 10g 或Oracle 9i,则应使用 org.hibernate.dialect.Oracle10gDialect org.hibernate.dialect.Oracle9iDialect 。完整参考:http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/dialect/package-summary.html

答案 1 :(得分:0)

您可以在applicationContext.xml中使用动态值。 例如,您可以从环境变量指向的外部属性文件中读取值,该变量包含文件的路径:

<context:property-placeholder location="file:${my_environmental_variable_name}/project.properties" />

假设您的属性文件包含:

hibernate.connection.url=jdbc:mysql://localhost:3306/yourapplication
hibernate.connection.username=username
hibernate.connection.password=yourpassword

您可以通过以下方式在appcontext.xml中使用它们:

<bean id="dataSourceShrms" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="${hibernate.connection.url}" />
    <property name="username" value="${hibernate.connection.username}" />
    <property name="password" value="${hibernate.connection.password}" />
</bean>

因此,您可以运行自己的应用程序,每次为您的&#39; my_environmental_variable_name&#39;定义不同的值。环境变量指向不同的属性配置文件。