当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA Hibernate+Persistence.xml未插入

云宜人
2023-03-14

我有一个问题插入不工作。读取(选择)工作正常。但是,在我的@Transactional方法的末尾没有执行insert。即使我确实看到在实体管理器上调用了事务commit/close。我已经尝试了不同的配置,但我仍然无法获得记录(插入)在事务结束时工作。而且我没有看到任何错误产生。我启用了hibernate.transaction调试,但没有看到任何Hibernate事务消息。

我正在使用Tomcat运行Spring boot(.1.5.3)作为WAR可执行文件。我在Spring Boot时使用persistence.xml(这是hibernate5-ddl-maven-plugin<在构建期间生成SQL DDL所必需的)。

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

下面是我的一些配置。

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

}

共有1个答案

邴俊民
2023-03-14

答对了!!!!我用@persistenceContext(unitName=PERSISTENCE_UNIT_NAME)注释了我的EntityManager。在那之后它就起作用了。

下面是修复上述问题的代码。请注意下面的@PersistenceContext注释(这就是解决该问题的方法)。在我在EM上使用@inject注释之前。

@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
protected EntityManager em;
 类似资料:
  • 问题内容: 我正在尝试设置一个Spring JPA Hibernate简单示例WAR,以将其部署到Glassfish。我看到一些示例使用persistence.xml文件,而其他示例则没有。有些示例使用数据源,有些则不使用。到目前为止,我的理解是,如果我拥有以下内容,则不需要dataSource: 我可以很好地部署,但是Spring不会注入我的EntityManager。 我的applicatio

  • 问题内容: 我正在使用Eclipse中的Servlet,JPA,EJB和JBoss进行项目。如您所见,在我的主题标题中,我的persistence.xml文件有一个错误,但我不知道哪个: 但是,当我尝试运行我的servlet时,出现以下错误: 我该如何解决这个问题 问题答案: 除非您没有复制粘贴整个文件,否则缺少结束标记。附加 在您的persistence.xml中 编辑 您的数据源的JNDI名称

  • 我无法正确获取此持久性文件...我在书中找不到任何更多的资料可供我参考。我用的是MySQL数据库。 编辑 严重:部署应用程序[VaadEntertainapp]时出现异常 Severe:org.xml.sax.SAXParseException:cvc-complex-type.2.4.a:发现以元素“provider”开头的内容无效。应为“{”http://java.sun.com/xml/ns

  • 问题内容: 我一直使用类似于以下内容的方法来实现它: …但是一旦加载,就会发生主键冲突。这是唯一插入到该表中的唯一语句。那么这是否意味着上述陈述不是原子的? 问题在于,这几乎不可能随意重建。 也许我可以将其更改为以下内容: 虽然,也许我使用了错误的锁,或者使用了过多的锁之类的东西。 看到了其他问题,那里的答案都提示“ IF(SELECT COUNT(*)…INSERT”等),但我始终处于(也许不正

  • 问题内容: 我正在尝试将值插入Android应用程序数据库。我正在编写以下代码: 我不知道是什么问题。所以我发布了Logcat: 问题答案: 通常,最好将包装方法(在您的情况下)分隔在单独的类中。我建议您使用名称创建一个新类,并在该类中添加所有包装方法,以使您的生活更轻松。 该类的代码如下所示:

  • 问题内容: 我知道的指示: JPA持久性机制读取“ persistence.xml”文件,查找名为“ persistence-unit- name”的持久性单元,并基于该持久性单元构造EntityManagerFactory。 我的问题是,如何强制JPA 使用不同于“ persistence.xml”的文件 ?例如“ persistence-test.xml”。 问题答案: 尽管单个JPA提供程序