2011-01-18 31 views
8

Estoy tratando de configurar una aplicación web Spring + Hibernate usando JNDI en lugar de un archivo de propiedades. Todo funciona bien por URL de base de datos, contraseña, inicio de sesión, etc., pero no puedo obtener el dialecto del contexto JNDI.Configurar el dialecto de hibernación usando JNDI (con Spring)

estoy usando esto en mi 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> 

El problema es que no sé cómo utilizar el valor JNDI para databaseDialect dentro de la propiedad <prop name="hibernate.dialect">blabla</prop>.

¿Alguna idea?

Respuesta

4

primavera puede convertir un Map a un Properties objeto, por lo que puede hacer lo siguiente:

<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> 

Referencia:

maneja la conversión de contenido String a Properties objeto. También maneja Map a Properties conversión, para llenando un objeto Properties a través de XML entradas de "mapa".

Fuente: PropertiesEditor javadoc

+0

funciona perfecto! ¡Gracias! – infinito

Cuestiones relacionadas