Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要使用数据库用户名&;登录到Hibernate;动态密码_Java_Spring_Hibernate - Fatal编程技术网

Java 需要使用数据库用户名&;登录到Hibernate;动态密码

Java 需要使用数据库用户名&;登录到Hibernate;动态密码,java,spring,hibernate,Java,Spring,Hibernate,有点像这个链接所描述的: 只是, 我需要相同的实现,但我无法指定applicationContext.xml而不是hibernate.cfg.xml,因为我的应用程序在applicationContext.xml 像这样 编辑: 通过Java(直接从web应用程序UI)使用类似JDBC loginconn=DBUtils.getConnection(user、pass、host),但使用Hibernate想象一下,您的数据库url、driverClassname、用户名和密码都在同名变量中

有点像这个链接所描述的:

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


编辑:
通过Java(直接从web应用程序UI)使用类似JDBC login
conn=DBUtils.getConnection(user、pass、host)
,但使用Hibernate

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

您有一个配置了Hibernate注释的类MyClass类 在包com.myapplication.POJO上

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

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();
}
Configuration Configuration=new Configuration().Configuration()
.setProperty(“hibernate.dialent”、“org.hibernate.dialent.Oracle8iDialect”)
.setProperty(“hibernate.connection.driver_class”,driverClassname)
.setProperty(“hibernate.connection.url”,url)
.setProperty(“hibernate.connection.username”,用户名)
.setProperty(“hibernate.connection.password”,password)
//在下一行中,您只需告诉Hibernate要查询哪些类
configuration=configuration.addPackage(“com.myapplication.POJO”)。
addAnnotatedClass(MyCustomClass.class);
StandardServiceRegistryBuilder ssrb=新的StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
SessionFactory=configuration.buildSessionFactory(ssrb.build());
//我们打开与数据库的会话
Session Session=factory.openSession();
列表结果=空;
试一试{
//这里我们从数据库中获取MyCustomClass对象的列表
结果=session.createQuery(“来自MyCustomClass”).list();
}捕获(例外e){
e、 printStackTrace();
}最后{
session.close();
}

重要:我认为Oracle8iDialect是Oracle数据库最常见的。如果您使用的是Oracle 10g或Oracle 9i,则应使用org.hibernate.dialent.oracle10dialentorg.hibernate.dialent.Oracle9iDialect。此处的完整参考:

您可以如下定义Hibernate属性

参考:


org.hibernate.dialogue.mysqldialogue
真的

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

<context:property-placeholder location="file:${my_environmental_variable_name}/project.properties" />
您可以通过以下方式在yout applicationcontext.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>

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

尝试以下操作:

// Get the application context. Alternatively you could implement the ApplicationContextAware interface
@Autowired private ApplicationContext applicationContext;


public void setPassword(String myDynamicallyCalculatedPassword){

   BasicDataSource dataSourceShrms = applicationContext.getBean("dataSourceShrms");
  dataSourceShrms.setPassword(myDynamicallyCalculatedPassword);

}
注意:根据设置密码的方法:

池初始化后,此方法当前无效。在第一次调用以下方法之一时初始化池:getConnection、setLogwriter、setLoginTimeout、getLoginTimeout、getLogWriter


因此,请确保不要先创建连接。如果您不能这样做,您可以尝试通过编程创建连接

请详细说明动态部分。意思是,在应用程序运行和部署之后,基本上是从web应用程序UI。没有得到“创建配置”部分。这将配置
applicationContext.xml
文件吗?使用此配置对象,我只需执行以下操作:
StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder().applySettings(Configuration.getProperties());factory=configuration.buildSessionFactory(ssrb.build());Session Session=factory.openSession()
然后您可以使用会话对象查询数据库。我使用的是
applicationContext.xml
。所以这是行不通的。请建议与
applicationContext.xml
相关的解决方案我刚刚更改了解决方案以满足您的特定需求。请检查它是否有效。谢谢@JavierFromMadrid,但据我所知,这是从
basicDataSource
读取url、用户名、密码,如
basicDataSource.getUsername()
等。它来自
applicationContext.xml
,具有指定的值。我需要动态地指定它们。在我现有的实现中,我在数据源中将用户名、密码、url和主机名指定为静态值。我需要避免这种情况,并允许用户输入这些值并从应用程序连接到数据库。就像JDBC在
conn=DBUtils.getConnection(user、pass、host)中所做的那样,但使用Hibernate。这是我们尝试的方向,但为此,我必须修改位于包中的(例如)database.properties文件。我怀疑这是不是一个正确的方法。无论如何,在更新该文件时遇到了某些问题。也许环境属性可以在包中包含配置属性文件名。如果你认为这个答案足够好的话,试着改变这种感觉,是的,谢谢,我知道这一点,我已经这么做了,但是我在修改属性文件时遇到了问题,我觉得这不是正确的做法。请参考我上面的评论。如果你建议在运行时修改属性文件,那么请向这个方向提出建议。不,我不是说修改属性文件。我建议使用各种属性文件。i、 e:config1.properties、config2.properties等
hibernate.connection.url=jdbc:mysql://localhost:3306/yourapplication
hibernate.connection.username=username
hibernate.connection.password=yourpassword
<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>
// Get the application context. Alternatively you could implement the ApplicationContextAware interface
@Autowired private ApplicationContext applicationContext;


public void setPassword(String myDynamicallyCalculatedPassword){

   BasicDataSource dataSourceShrms = applicationContext.getBean("dataSourceShrms");
  dataSourceShrms.setPassword(myDynamicallyCalculatedPassword);

}