Spring JPA and persistence.xml

后端 未结 5 1777
自闭症患者
自闭症患者 2020-12-04 20:08

I\'m trying to set up a Spring JPA Hibernate simple example WAR for deployment to Glassfish. I see some examples use a persistence.xml file, and other examples do not. Some

相关标签:
5条回答
  • 2020-12-04 20:25

    If anyone wants to use purely Java configuration instead of xml configuration of hibernate, use this:

    You can configure Hibernate without using persistence.xml at all in Spring like like this:

    @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;
    }
    

    Since you are not using persistence.xml, you should create a bean that returns DataSource which you specify in the above method that sets the data source:

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

    Then you use @EnableTransactionManagement annotation over this configuration file. Now when you put that annotation, you have to create one last bean:

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

    Now, don't forget to use @Transactional Annotation over those method that deal with DB.

    Lastly, don't forget to inject EntityManager in your repository (This repository class should have @Repository annotation over it).

    0 讨论(0)
  • 2020-12-04 20:26

    This may be old, but if anyone has the same problem try changing unitname to just name in the PersistenceContext annotation:

    From

    @PersistenceContext(unitName="educationPU")
    

    to

    @PersistenceContext(name="educationPU")
    
    0 讨论(0)
  • 2020-12-04 20:29

    I have a test application set up using JPA/Hibernate & Spring, and my configuration mirrors yours with the exception that I create a datasource and inject it into the EntityManagerFactory, and moved the datasource specific properties out of the persistenceUnit and into the datasource. With these two small changes, my EM gets injected properly.

    0 讨论(0)
  • 2020-12-04 20:32

    I'm confused. You're injecting a PU into the service layer and not the persistence layer? I don't get that.

    I inject the persistence layer into the service layer. The service layer contains business logic and demarcates transaction boundaries. It can include more than one DAO in a transaction.

    I don't get the magic in your save() method either. How is the data saved?

    In production I configure spring like this:

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

    along with the reference in web.xml

    For unit testing I do this:

    <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>
    
    0 讨论(0)
  • 2020-12-04 20:35

    Just to confirm though you probably did...

    Did you include the

    <!--  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 in your application context.xml?

    Also I'm not so sure you'd be able to use a jta transaction type with this kind of setup? Wouldn't that require a data source managed connection pool? So try RESOURCE_LOCAL instead.

    0 讨论(0)
提交回复
热议问题