En mi aplicación J2EE trato de usar spring-boot y JPA tecnologías con la inyección de EntityManager en la capa DAO. Sin embargo, tengo algunos problemas… Mi repositorio de usuario CRUD:

@Repository
public class UserRepositoryImpl implements UserRepository {

@PersistenceContext(unitName = "data")
private EntityManager entityManager;
//and crud methods
}

Mi primavera-inicio de la clase de aplicación:

@SpringBootApplication
public class App {
    public static void main(String [] args) {
        SpringApplication.run(App.class, args);
    }

}

Y por último, mi persistence.xml, que se encuentra en el directorio src/main/resources/carpeta META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
<persistence-unit name="data" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>com.example.domain.User</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.autocommit" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
        <property name="hibernate.c3p0.min_size" value="4" />
        <property name="hibernate.c3p0.max_size" value="128" />
        <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=qwerty;sendStringParametersAsUnicode=false" />
        <property name="javax.persistence.jdbc.user" value="sa" />
        <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="javax.persistence.jdbc.password" value="" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="false" />
    </properties>
</persistence-unit>

Así, cuando trato de usar este inyectado entityManager puedo obtener NullPointerException. Otros @Autowired campos se inyecta sin ningún tipo de problemas. Lo que está mal con este código? Necesito alguna configuración adicional?
Soy un principiante (ni siquiera un desarrollador Junior) y tengo cierta incomprensión de lo que Spring-boot es y cómo se configura como la Primavera en el archivo xml. Si un xml de configuración es necesaria debido a inyectar EM, por favor, muestran cómo hacerlo.

upd2. Las dependencias

<dependencies>
    <!-- logger -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>

    <!-- db -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
    </dependency>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
    </dependency>
    <dependency>
        <groupId>com.microsoft</groupId>
        <artifactId>sqljdbc4</artifactId>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.3</version>
    </dependency>

    <!-- csv -->
    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>3.3</version>
    </dependency>

    <!-- spring-boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>1.2.4.RELEASE</version>

        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>

    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.2.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.2.4.RELEASE</version>

        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>

    </dependency>
publique sus dependencias
¿Se han definido entityManager bean, el cual se inyecta más tarde? No parece que la han definido.
Donde debo definir este bean? ¿Puede dar un ejemplo?

OriginalEl autor goldaniga | 2015-06-10

3 Comentarios

  1. 6

    Debe utilizar la dependencia para la primavera-arranque-motor de arranque-datos-jpa

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    Y el uso de una persistencia xml, se debe definir un bean como se dice en la documentación.

    Primavera no requiere el uso de XML para configurar el JPA proveedor, y el Resorte de Arranque se supone que usted desea tomar ventaja de esta característica. Si prefieres usar persistence.xml entonces usted necesita para definir sus propias @Bean de tipo LocalEntityManagerFactoryBean (con id ‘entityManagerFactory’, y el conjunto de la unidad de persistencia nombre.

    http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-use-traditional-persistence-xml

    O puede omitir la persistence.xml totalmente y definir las propiedades de conexión en la aplicación.archivo de propiedades.

    Cita de la documentación

    De configuración de origen de datos está controlado por la configuración externa de las propiedades en la primavera.origen de datos.*. Por ejemplo, podría declarar la siguiente sección de la aplicación.propiedades:

    spring.datasource.url=jdbc:mysql://localhost/test
    spring.datasource.username=dbuser
    spring.datasource.password=dbpass
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database

    (cambiar el driver y otros datos para que coincida con su entorno)

    Buena suerte!

    Gracias! Esto ayuda mucho, y ahora entityManager para las operaciones de Lectura no es nulo, pero para los métodos, que son anotado con @Transactional es nulo. Debo de alguna manera de configurar un administrador de transacciones? Cómo hacerlo?
    Oh, lo siento, es mi error… Todo es genial ahora! Muchas gracias!
    Ok genial, me alegra saber que funciona 🙂
    Por desgracia, tengo un nuevo problema 🙁 EntityManager es ahora inyectado, pero las transacciones no son administrados. Qué necesito para especificar cualquier otra dependencia o propiedad en la aplicación.archivo de propiedades?
    Usted debe agregar la dependencia para la primavera-tx <groupId>org.springframework</groupId><artifactId>spring-tx</artifactId>. Echa un vistazo aquí la primavera.io/guías/gs/gestión de transacciones

    OriginalEl autor stalet

  2. 4

    puede utilizar la configuración de java con el fin de configurar la persistencia jpa. El código de abajo muestran de ejemplo de ejemplo de configuración:

    @Component
    public class JpaConfiguration {
    
        @Bean
        @Primary
        public DataSource dataSource() {
    
            final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
            dataSource.setDriver(new org.postgresql.Driver());
            dataSource.setUrl("jdbc:postgresql://localhost:5432/users"); 
            dataSource.setUsername("postgres");
            dataSource.setPassword("admin");
    
            return dataSource;
        }
    
        @Bean
        public JpaVendorAdapter jpaVendorAdapter() {
            HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
            jpaVendorAdapter.setGenerateDdl(true);
            jpaVendorAdapter.setShowSql(true);
            jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
    
            return jpaVendorAdapter;
        }  
    
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    
            LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
            lef.setPackagesToScan("tn.bergit.crud.entity");
            lef.setDataSource(dataSource());
            lef.setJpaVendorAdapter(jpaVendorAdapter());
    
            Properties properties = new Properties();
            properties.setProperty("hibernate.show_sql", "true");
            properties.setProperty("hibernate.jdbc.fetch_size", "100");
            properties.setProperty("hibernate.hbm2ddl.auto", "update");
    
            lef.setJpaProperties(properties);
            return lef;
        }    
    
    
    }

    Se puede ver este ejemplo en github (haga clic aquí)

    OriginalEl autor BERGUIGA Mohamed Amine

  3. 0

    si quieres seguir usando persistence.xml archivo que acaba de agregar el siguiente código en la configuración de la clase

        @Bean
    public LocalEntityManagerFactoryBean entityManagerFactory(){
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("data");
        return factoryBean;
    }

    OriginalEl autor vedat

Dejar respuesta

Please enter your comment!
Please enter your name here