Estoy tratando de configurar un Spring JPA Hibernate simple ejemplo de la GUERRA para la implementación de Glassfish.
Puedo ver algunos ejemplos de uso de un persistence.xml de archivo, y otros ejemplos no.
Algunos ejemplos de uso de un origen de datos, y algunos no. Tan lejos de mi comprensión es que un origen de datos no es necesario si la tengo:

<persistence-unit name="educationPU"
    transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.coe.jpa.StudentProfile</class>
    <properties>
        <property name="hibernate.connection.driver_class"
            value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url"
            value="jdbc:mysql://localhost:3306/COE" />
        <property name="hibernate.connection.username" value="root" />
        <property name="show_sql" value="true" />
        <property name="dialect" value="org.hibernate.dialect.MySQLDialect" />
    </properties>
</persistence-unit>

Puedo implementar bien, pero mi EntityManager es no ser inyectado en la Primavera.

Mi applicationContext.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="educationPU" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="StudentProfileDAO" class="com.coe.jpa.StudentProfileDAO">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="studentService" class="com.coe.services.StudentService">
</bean>

Mi clase con el EntityManager:

public class StudentService {
private String  saveMessage;
private String  showModal;
private String modalHeader;
private StudentProfile studentProfile;
private String lastName;
private String firstName;

@PersistenceContext(unitName="educationPU")
private EntityManager em;

@Transactional
public String save()
{
    System.out.println("*** em: " + this.em); //em is null
    this.studentProfile= new StudentProfile();
    this.saveMessage = "saved";
    this.showModal = "true";
    this.modalHeader= "Information Saved";
    return "successs";
}

Mi web.xml:

  <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

Hay piezas que me faltan para tener la Primavera inyectar «em» en StudentService?

InformationsquelleAutor bmw0128 | 2009-07-15

5 Comentarios

  1. 13

    Solo para confirmar, aunque probablemente lo hizo…

    ¿Incluye el

    <!--  tell spring to use annotation based congfigurations -->
    <context:annotation-config />
    <!--  tell spring where to find the beans -->
    <context:component-scan base-package="zz.yy.abcd" />

    bits en su aplicación context.xml?

    También no estoy tan seguro de que sería capaz de utilizar un tipo de transacción jta con este tipo de instalación? No que requieren de una fuente de datos administrada de conexión de la piscina? Así que trate de RESOURCE_LOCAL lugar.

  2. 4

    Estoy confundido. Estás inyectando un PU en la capa de servicio y no de la capa de persistencia? No entiendo eso.

    Me inyecto la capa de persistencia en la capa de servicio. La capa de servicio contiene la lógica de negocio y demarca los límites de la transacción. Se puede incluir más de un DAO en una transacción.

    No tengo la magia en su método save() cualquiera de los dos. Cómo es que los datos guardados?

    En la producción que configurar la primavera como esta:

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

    junto con el de referencia en web.xml

    Para la unidad de pruebas puedo hacer esto:

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="dataSource" p:persistence-xml-location="classpath*:META-INF/test-persistence.xml"
        p:persistence-unit-name="RealPUName" p:jpaDialect-ref="jpaDialect"
        p:jpaVendorAdapter-ref="jpaVendorAdapter" p:loadTimeWeaver-ref="weaver">
    </bean>
  3. 1

    Si alguien quiere usar puramente configuración de Java en lugar de xml de configuración de hibernate, utilice esto:

    Puede configurar Hibernate sin usar persistence.xml en la Primavera como en el caso de este:

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
    {
    Map<String, Object> properties = new Hashtable<>();
    properties.put("javax.persistence.schema-generation.database.action",
    "none");
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); //you can change this if you have a different DB
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(adapter);
    factory.setDataSource(this.springJpaDataSource());
    factory.setPackagesToScan("package name");
    factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
    factory.setValidationMode(ValidationMode.NONE);
    factory.setJpaPropertyMap(properties);
    return factory;
    }

    Puesto que usted no está utilizando persistence.xml se debe crear un bean que devuelve origen de datos que se especifica en el método anterior, que establece la fuente de los datos:

    @Bean
    public DataSource springJpaDataSource()
    {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl("jdbc:mysql://localhost/SpringJpa");
    dataSource.setUsername("tomcatUser");
    dataSource.setPassword("password1234");
    return dataSource;
    }

    A continuación, utilizar @EnableTransactionManagement anotaciones sobre este archivo de configuración. Ahora cuando pones esa anotación, usted tiene que crear una última bean:

    @Bean
    public PlatformTransactionManager jpaTransactionManager()
    {
    return new JpaTransactionManager(
    this.entityManagerFactoryBean().getObject());
    }

    Ahora, no olvides usar @Transactional Anotación sobre los método que lidiar con la DB.

    Por último, no te olvides de inyectar EntityManager en el repository (repositorio de la clase debe tener @Repository anotación sobre él).

  4. 0

    Tengo una aplicación de prueba establecido usando JPA/Hibernate & Primavera, y de la configuración de mi espejos tuyo con la excepción de que puedo crear un origen de datos y la inyecta en el EntityManagerFactory, y se trasladó el origen de datos de propiedades específicas de la persistenceUnit y en el origen de datos. Con estos dos pequeños cambios, a mi EM se inyecta correctamente.

  5. 0

    Esto puede ser viejo, pero si alguien tiene el mismo problema intente cambiar unitname a sólo el nombre en la PersistenceContext anotación:

    De

    @PersistenceContext(unitName="educationPU")

    a

    @PersistenceContext(name="educationPU")
    • Eh? El facultativo name atributo de @PersistenceContext se utiliza para buscar la inyección de administrador de la entidad. no tiene ningún elemento correspondiente en persistence.xml. Si funcionó para usted, esta es la OMI sólo una suerte de efectos secundarios relacionados con la ausencia de unitName (el comportamiento en este caso es específico del vendedor). Pero esto no es correcto.

Dejar respuesta

Please enter your comment!
Please enter your name here