java - 使用 JNDI(使用 Spring)配置 hibernate 的方言

标签 java spring hibernate jndi dialect

我正在尝试使用 JNDI 而不是属性文件来配置 Spring+Hibernate Web 应用程序。数据库 url、密码、登录名等一切正常,但我无法从 JNDI 上下文中获取方言。

我在我的 datatabase-context.xml 中使用它:

<bean id="databaseUrl" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/url"/>
</bean>
<bean id="databaseDriver" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/driver"/>
</bean>
<bean id="databaseUsername" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/username"/>
</bean>
<bean id="databasePassword" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/password"/>
</bean>
<bean id="databaseDialect" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/dialect"/>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" ref="databaseDriver"/>
    <property name="url" ref="databaseUrl"/>
    <property name="username" ref=databaseUsername"/>
    <property name="password" ref="databasePassword"/>
    <property name="maxWait" value="30000"/>
    <property name="validationQuery" value="select 1"/>
    <property name="maxActive" value="100"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan">...</property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.show_sql">true</prop>
            <!--<prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>-->
            <!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>-->
        </props>
    </property>
</bean>

问题是我不知道如何在 <prop name="hibernate.dialect">blabla</prop> 中使用 databaseDialect 的 JNDI 值属性(property)。

有什么想法吗?

最佳答案

Spring 可以将 Map 转换为 Properties 对象,因此您可以执行以下操作:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <util:map>
            <entry key="hibernate.hbm2ddl.auto" value="update" />
            <entry key="hibernate.show_sql" value="true" />
            <entry key="hibernate.dialect">
                <jee:jndi-lookup jndi-name="java:comp/env/jdbc/dialect" />
            </entry>
        </util:map>
    </property>
</bean>

引用:

Handles conversion from content String to Properties object. Also handles Map to Properties conversion, for populating a Properties object via XML "map" entries.

来源:PropertiesEditor javadoc

关于java - 使用 JNDI(使用 Spring)配置 hibernate 的方言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4723918/

相关文章:

java - spring 中的 c 命名空间构造函数参数 : Attribute c:_ is not allowed here

java - 可以在 JSR 330 中将 @Inject 设为可选(如 @Autowire(required=false) 吗?

java - 定义映射时出现 Hibernate 异常

java - 在Java中解析Java日期格式

java - Android:从ArrayList中提取数据

java - 注入(inject)的 Bean 在抽象类中为 null

java - 如何向复杂查询添加 HQL 子句 (WHERE COUNT()< MAX_VAL)

java - 您可以将 Controller 列表参数与 Hibernate 标准结合起来吗?

java - 如何从 xlsm 加密文件中读取?

java - 容器异常 : The ResourceConfig instance does not contain any root resource classes while deploying my app on Wildfly Server