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

Spring Boot JPA Hibernate在repository.save时不提交

宋智明
2023-03-14

我有一个带MySQL的Spring Boot应用程序JPA。在我的控制器中,当我发布一个实体时,我可以调用存储库。保存,然后返回“创建/更新”对象。

但是,当我查看数据库时,我看到对象没有更新。

这是我的application.yml:

spring:
  jpa:
    show-sql: true
    generate-ddl: false
    hibernate:
      ddl-auto: none
    properties:
      hibernate.dialect: org.hibernate.dialect.MySQLDialect
      org.hibernate.envers.store_data_at_delete: true
      org.hibernate.envers.global_with_modified_flag: true
      org.hibernate.envers.track_entities_changed_in_revision: true
  datasource:
    initialize: false
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:databaseName}?createDatabaseIfNotExist=true
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:root}
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      minimumIdle: 20
      maximumPoolSize: 30
      idleTimeout: 5000
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048

你知道我还要做什么吗?

这是我的控制器:

@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public MyEntity saveMyEntity(@Valid @RequestBody final MyEntity myEntity) {
    Assert.notNull(myEntity, "The entry cannot be null");
    return myEntityService.save(myEntity);
}

和MyEntityService:

@Override
@UserCanCud
public Entity save(final Entity entity) {
    Assert.notNull(entity);
    final Entity savedEntity = repository.save(entity);
    return savedEntity;
}

共有3个答案

羊舌勇
2023-03-14

我认为你的问题在于你使用注释@UserCanCud进行的拦截。

我刚刚用您提出的相同设置做了一个项目,它工作正常。看看:

https://github.com/nitzap/spring-data-mysql

如果我错过了什么,就告诉我。

任元青
2023-03-14

我终于找到了解决办法。。。我试图更新的实体上有@Immutable注释。。。

融焕
2023-03-14

在我(有限的)经验中,由于Spring幕后的魔力,这些类型的问题更难调试,但我会尝试给出一些建议,帮助我解决类似的问题——希望这能给你所需要的提示。

@Transactional表示法建立了一个事务范围,该范围指示事务的开始和结束时间,也称为其边界。如果你在这个边界之外操作,你要么会收到错误,要么事情就无法按预期工作。

首先,我发现这篇文档对Spring事务最有帮助:http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html特别是这一部分

其次,您可能希望启用跟踪级别日志和可能的SQL语句来帮助调试这个。为了这样做,我将以下内容添加到我的application.properties-您将能够将其添加到您的application.yml中,并进行一些细微的调整

spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.show-sql=true
logging.level.org.hibernate=TRACE

这里会有很多输出,但你会对幕后发生的事情有一个很好的了解。

第三,也是我在学习如何使用@Transactional时最重要的部分是,如果在相同的事务范围内,对DAO的每次调用都会创建一个新的会话-or-重用现有会话。有关这方面的示例,请参阅上面的留档。

现在,我怀疑当你读回更新的对象时,你的事务仍然被认为是打开的。尝试在save方法中执行flush,看看这是否有助于将更改保留回数据库。

希望您能够在不使用上述资源的情况下找到问题,如果没有,您至少应该有一些关于持久性为何不持久的更完整信息。

 类似资料:
  • 今天我尝试了Spring Data Neo4j,我终于让它工作了... 我正在使用: Spring 4.0。2 Spring数据Neo4j 3.0。0 QueryDSL 3.3。1 Neo4j 2.0。一, 这是我的配置: 我的域名类: 和我的仓库: 我可以在DB中成功创建一个用户,然后通过以下方式检索该用户: 但是:如果我现在再次调用我的create代码,它不会抛出异常,因为,它只会覆盖数据库中

  • 我有一些角6形式,我集中在第一个可用的领域。它们包含一个提交按钮,当我按enter时,表单将自动提交,并触发ngSubmit事件。

  • 我的spark作业引发了一个无法跟踪的空指针异常。当我打印潜在的null变量时,它们都填充在每个Worker上。我的数据不包含空值,因为同一作业在spark Shell中工作。下面是作业的execute函数,后面是错误消息。 没有在函数中定义的所有helper方法都是在spark作业对象的主体中定义的,所以我相信闭包不是问题所在。 以及下面的错误消息: java.lang.NullPointerE

  • 我是新来的反应,我有一些疑问关于useState钩子。我最近正在开发一个基于应用编程接口的食谱反应应用程序。我面临的问题是,当我在搜索表单中提交东西时,状态应该发生变化,但状态没有变化,但如果我重新提交表单,状态就会发生变化。 函数的作用是:保存表单输入的值,每次我提交表单时,该值都是正确的,但是setQuery(queryString)不会更改查询值或状态,如果我重新提交表单,它会更改状态。

  • 当我站在上面提交拓扑时,我在storm jar中遇到了问题 我写 打出来的 没有找到Storm指令 我想知道怎么了? Storm罐之间的区别是什么。。。。和 都在提交拓扑?

  • 下面是MultistepForm的代码。我已经实现了一个多步骤表单功能,所以这里一切都很好,只是问题是在这个表单中,我在最后一步有一个预览页面,所以当我点击提交按钮时,表单正在消失,按钮正在顶部移动。所以如果有人能帮我请。