Pergunta

currently I'm fooling around with a Spring setup. My goal is to use JPA to get access to a Websphere datasource using it's JNDI name. I'm using Spring Data JPA to make life easier for me and worked through some tutorials to get the basic idea.

Bad thing: none of those is talking about the Spring configuration for my JPA szenario + I never worked with JPA / JDBC before. So I hope you can help me out here. I got 2 configuration files:

applicationContext.xml

<bean id="txManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />

<bean id="eManager" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"></bean>

Since i'm using the @Transactual annotion within my code, i'm using the annotation-driven tag for the txManager. I'm just not really sure what else i should configure for the txManager and what the sessionFactory tag is doing. Is there any documentation for all supported XML tags? Am I missing a importent tag for my szenario?

Same about eManager - not sure if thats right in any way.

persistence.xml

<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="spring-jpa">
        <jta-data-source>jdbc/myJNDI</jta-data-source>
    </persistence-unit>
</persistence>

Same thing here: don't really know what i'm doing. I know i need a persistence unit / provider. I know that many are using hibernate for this, but i would like to stay native and use pure JavaEE / Spring if possible. I'm just not sure how to configure that. Currently my project is crashing, telling me: "JPA PersistenceProvider returned null"

Foi útil?

Solução

The best way is to obtain the EntityManagerFactory from the JNDI via Spring's JNDI support:

<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/myPersistenceUnit" />

<jpa:repositories base-package="com.acme.repositories" />

<tx:jta-transactionManager />

This will cause the transaction manager being used from the application server as well. You can also try to setup a JpaTransactionManager and wire the EntityManagerFactory obtained from JNDI into it. You can pull even more configuration into your Spring config files if you only lookup the datasource through an <jee:jndi-lookup /> namespace element and follow the further configuration instructions in the Spring Data JPA reference documentation. Nevertheless it's usually better to use the container resources you can actually get if you decide to use container resources at all.

Outras dicas

I just started working with Spring, jpa mysql etc... and I might be able to help you out. I'll show you the way that I have my configuration right know.

I'm using hibernate by the way for my database connection, I've never did it without so no help from me there :)

My configuration:

Spring-config.xml:

<context:component-scan base-package="com.MYPACKAGE"/> 
<!-- To find all your controllers -->

<tx:annotation-driven/> 
<!-- This will pickup all your @Transactional annotations-->

<import resource="../database/DataSource.xml"/>
<import resource="../database/Hibernate.xml"/>
<!-- These are my database config files-->

Datasource.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/DATABASENAME"/>
    <property name="username" value="USERNAME"/>
    <property name="password" value="PASSWORD"/>
</bean>

Hibernate.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>

I left out the standard xml text that you need to include at the top of your .xml files, but I trust you to work that out yourself ;)

This setup works for me and I hope it can help you out! If you have any question regarding this post please let me know!

Good luck!

for those using JBoss, the jndi names can be set in persistence.xml properties like this:

    <persistence-unit name="punit" transaction-type="JTA">

      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/myDS/jta-data-source>

      <class>com.company.model.Document</class>
      <class>com.company.model.DocumentIndividual</class>

      <properties>
        <property name="hibernate.hbm2ddl.auto" value="create" />
        <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> -->
        <property name="javax.persistence.logging.level" value="INFO" />
        <property name="hibernate.show_sql" value="true" />
        <property name="jboss.entity.manager.jndi.name" value="java:/my_em"/>
        <property name="jboss.entity.manager.factory.jndi.name" value="java:/my_emf"/>
    </properties>

</persistence-unit>

as described in here section 4.4.2

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top