【问题标题】:Spring Boot JPA Hibernate + persistence.xml Not InsertingSpring Boot JPA Hibernate + persistence.xml 未插入
【发布时间】:2017-11-20 00:12:09
【问题描述】:

我遇到插入不起作用的问题。读取(选择)工作正常。但是,在我的 @Transactional 方法末尾没有执行插入。即使我确实看到在实体管理器上调用了事务提交/关闭。我尝试了不同的配置,但我仍然无法在事务结束时让记录(插入)工作。而且我没有看到任何错误正在生成。我启用了 hibernate.transaction 调试,但没有看到任何休眠事务消息。

我正在运行 Spring boot (.1.5.3) 作为 Tomcat 的 WAR 可执行文件。我在 Spring Boot 上使用 persistence.xml(hibernate5-ddl-maven-plugin

在调试时,我看到 JpaTransactionManager 创建新事务(使用名称创建新事务... Opened new EntityManager ,,,将 JPA 事务公开为 JDBC 事务),加入其他 @Transactional 方法(找到线程绑定的 EntityManager ...参与现有事务)并提交 TX(启动事务提交...在 EntityManager 上提交 JPA 事务),并关闭 JPA EM(关闭 JPA EntityManager)。这一切都根据@Transactional 规范发生。但是,该记录不会插入到数据库中。而且我没有看到任何休眠事务消息。

下面是我的一些配置。

persistence.xml:

<persistence version="2.1"
         xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

<!--
This file is needed to generate the DDL.
-->

<persistence-unit
    name="EzListaPersistence"
    transaction-type="RESOURCE_LOCAL">

    <description>
        The set of entity types that can be managed by a
        given entity manager is defined by a persistence unit. A
        persistence unit defines the set of all classes that are
        related or grouped by the application, and which must be
        collocated in their mapping to a single data store.
    </description>

    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <!--
      List of fully qualified Entity Classes
    -->

    <class>com.ezlista.domain.account.Account</class>
    ...... NOT DISPLAYED ....
    <class>com.ezlista.domain.useraccount.Notification</class>

    <properties>
        <!--  Hibernate Connection Settings -->
        <property
            name="hibernate.connection.provider_class"
            value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" />
        <property
            name="hibernate.hikari.dataSourceClassName"
            value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
        <property
            name="hibernate.hikari.dataSource.url"
            value="jdbc:mysql://localhost:3306/EZLISTA?verifyServerCertificate=false&amp;useSSL=false" />
        <property
            name="hibernate.hikari.dataSource.user"
            value="rubens" />
        <property
            name="hibernate.hikari.dataSource.password"
            value="***MASKED***" />
        <property
            name="hibernate.hikari.dataSource.cachePrepStmts"
            value="true" />
        <property
            name="hibernate.hikari.dataSource.prepStmtCacheSize"
            value="250" />
        <property
            name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit"
            value="2048" />
        <property
            name="hibernate.hikari.minimumIdle"
            value="5" />
        <property
            name="hibernate.hikari.maximumPoolSize"
            value="10" />
        <property
            name="hibernate.hikari.idleTimeout"
            value="30000" />


        <!--  SQL Settings -->
        <property name="hibernate.dialect"
                  value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        <property name="hibernate.show_sql"
                  value="false" />
        <property name="hibernate.format_sql"
                  value="true" />
        <property name="hibernate.use_sql_comments"
                  value="false" />
        <property name="hibernate.ddl-auto"
                  value="none" />

        <!--  Hibernate Cache Settings -->
        <property name="hibernate.javax.cache.provider"
                  value="org.ehcache.jsr107.EhcacheCachingProvider" />
        <property name="hibernate.cache.region.factory_class"
                  value="org.hibernate.cache.jcache.JCacheRegionFactory" />
        <property name="hibernate.cache.use_second_level_cache"
                  value="true" />
        <property name="hibernate.cache.use_query_cache"
                  value="false" />
        <property name="hibernate.cache.use_structured_entries"
                  value="true" />
        <property name="hibernate.cache.use_minimal_puts"
                  value="true" />
    </properties>

</persistence-unit>

Java 配置:

@EntityScan("com.ezlista.domain")
@EnableTransactionManagement

/**
 * Spring Bootstrap Repository Configuration.
 *
 * @author Rubens Gomes
 */
@Configuration
public class RepositoryConfiguration
{
private final static Logger logger = LoggerFactory.getLogger(RepositoryConfiguration.class);
private final static String PERSISTENCE_UNIT = "EzListaPersistence";

@Inject
private Environment env;

public RepositoryConfiguration()
{
    super();
    logger.debug("Constructed");
}


// DataSource
@Bean(name = "dataSource")
public DataSource dataSource()
{
    logger.info("Registering HikariDataSource bean.");
    HikariDataSource ds = new HikariDataSource();

    ds.setDataSourceClassName(env.getRequiredProperty("hikari.dataSourceClassName"));
    ds.setMinimumIdle(env.getRequiredProperty("hikari.minimumIdle", Integer.class));
    ds.setMaximumPoolSize(env.getRequiredProperty("hikari.maximumPoolSize", Integer.class));
    ds.setIdleTimeout(env.getRequiredProperty("hikari.idleTimeout", Integer.class));
    ds.setPoolName(env.getRequiredProperty("hikari.poolName"));

    ds.addDataSourceProperty("user", env.getRequiredProperty("hikari.dataSource.user"));
    ds.addDataSourceProperty("password", env.getRequiredProperty("hikari.dataSource.password"));
    ds.addDataSourceProperty("databaseName", env.getRequiredProperty("hikari.dataSource.databaseName"));
    ds.addDataSourceProperty("serverName", env.getRequiredProperty("hikari.dataSource.serverName"));
    ds.addDataSourceProperty("cachePrepStmts", env.getRequiredProperty("hikari.dataSource.cachePrepStmts", Boolean.class));
    ds.addDataSourceProperty("prepStmtCacheSize", env.getRequiredProperty("hikari.dataSource.prepStmtCacheSize", Integer.class));
    ds.addDataSourceProperty("prepStmtCacheSqlLimit", env.getRequiredProperty("hikari.dataSource.prepStmtCacheSqlLimit", Integer.class));

    return ds;
}


// EntityManagerFactory
@Bean(name = "entityManagerFactory")
public EntityManagerFactory entityManagerFactory()
{
    logger.info("Registering EntityManagerFactory bean.");
    JpaVendorAdapter hibernateJpavendorAdapter = new HibernateJpaVendorAdapter();
    JpaDialect hibernateJpaDialect = new HibernateJpaDialect();

    LocalContainerEntityManagerFactoryBean emfBean =
            new LocalContainerEntityManagerFactoryBean();
    emfBean.setJpaVendorAdapter(hibernateJpavendorAdapter);
    emfBean.setJpaDialect(hibernateJpaDialect);
    emfBean.setPersistenceUnitName(PERSISTENCE_UNIT);
    emfBean.setDataSource(dataSource());
    emfBean.afterPropertiesSet();
    return emfBean.getObject();
}


// TransactionManager
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager()
{
  logger.info("Registering JpaTransactionManager bean.");

  JpaTransactionManager txManager = new JpaTransactionManager();
  EntityManagerFactory emf = entityManagerFactory();
  txManager.setEntityManagerFactory(emf);
  txManager.setDataSource(dataSource());
  return txManager;
}

}

【问题讨论】:

    标签: spring hibernate transactions persistence.xml hikaricp


    【解决方案1】:

    宾果游戏!!!! 我用@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME) 注释了我的EntityManager。之后它就起作用了。

    这是解决上述问题的代码。请注意下面的 @PersistenceContext 注释(这就是解决问题的原因)。在我对 em 进行 @Inject 注释之前。

    @PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
    protected EntityManager em;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2018-05-17
    • 2020-11-24
    • 2017-08-11
    • 2020-02-04
    • 2016-03-08
    • 2021-04-02
    • 2015-04-18
    相关资源
    最近更新 更多