当repository.save时,Spring Boot + JPA + Hibernate不会提交

Man*_*rte 10 hibernate jpa commit spring-boot

我有一个Spring Boot Application + JPA with MySQL.在我的控制器中,当我发布一个实体时,我可以调用repository.save,然后返回"created/updated"对象.

但是,当我查看数据库时,我发现对象没有更新.

这是我的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
Run Code Online (Sandbox Code Playgroud)

你知道我还需要做什么吗?

这是我的控制器:

@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);
}
Run Code Online (Sandbox Code Playgroud)

和MyEntityService:

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

Rob*_*t H 9

在我的(有限的)经验中,这些类型的问题因为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
Run Code Online (Sandbox Code Playgroud)

这里会有很多输出,但你会很好地了解幕后发生的事情.

第三,对我来说,学习如何使用的最重要部分@Transactional是每次调用DAO都会创建一个新会话 - 或者 - 如果在同一事务范围内,则重用现有会话.有关此示例,请参阅上面的文档.

现在,我怀疑当您回读更新的对象时,您的交易仍被视为已打开.尝试flush在save方法中执行a操作,看看是否有助于将更改保留在数据库中.

希望你能够使用上面的资源找到问题而不需要太多的搜索,如果不是,你至少应该有一些更完整的信息来解释为什么持久性不会持续存在.


Man*_*rte 5

我终于找到了解决方案......我试图更新的实体上有@Immutable注释......