mysql - JPA-hib不保存到数据库,而是读取数据库(mysql,Hikari,tomcat 9,spring boot 2.1.8)

标签 mysql spring hibernate spring-boot jpa

我在 Multi-Tenancy 应用程序中拥有最新版本的 mysql、Hikari、Spring Boot 2,并以编程方式使用数据源集。

我能够读取(mysql)数据库中的表条目,但无法更新、插入或修改。

基本上如下,“相信会导致保存请求排队

==========

j.i.AbstractLogicalConnectionImplementor : Preparing to begin transaction via JDBC Connection.setAutoCommit(false)
2019-09-25 10:05:20.758 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Transaction begun via JDBC Connection.setAutoCommit(false)

========

导致插入排队

======== [com.xx.xx.xx.user] 对象的 EntityIdentityInsertAction

2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.engine.spi.ActionQueue     : Adding insert with no non-nullable, transient entities: [EntityIdentityInsertAction[com.xx.xx.user#<delayed:2>]]

========

如何将底层 JDBC 连接设置为自动提交?

我错过了什么?提前致谢

尝试过:

  1. repo.saveAndFlush() 和 repo.flush() -- 都给我提供了没有正在进行的事务的异常

  2. 已序列化对象/表实体

  3. 已设置 ds.setAutoCommit(true); ds.setReadOnly(假);//ds 是数据源

  4. 在application.properties中已设置 spring.datasource.hikari.auto-commit =true

=====Hikari 池配置转储显示自动提交为 true ===

2019-09-25 10:05:20.795 DEBUG 2643 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariConfig           : allowPoolSuspension.............false
2019-09-25 10:05:20.795 DEBUG 2643 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariConfig           : autoCommit......................true

========Hikari 配置转储结束 ====

但是,在调用 repo.save(user) 时,JDBC 跟踪显示 auotcommit 为 false

019-09-25 10:05:20.758 DEBUG 2643 --- [nio-8080-exec-1] o.h.e.t.internal.TransactionImpl         : begin
2019-09-25 10:05:20.758 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Preparing to begin transaction via JDBC Connection.setAutoCommit(false)
2019-09-25 10:05:20.758 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Transaction begun via JDBC Connection.setAutoCommit(false)
2019-09-25 10:05:20.759 TRACE 2643 --- [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterBeginCallback

2019-09-25 10:05:20.759 TRACE 2643 --- [nio-8080-exec-1] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session.  tenant=1, owner=null
2019-09-25 10:05:20.759 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : Opened Session [c0c25dff-2c0a-4996-b352-1ac4d49e48e8] at timestamp: 1569423920759
2019-09-25 10:05:20.760 TRACE 2643 --- [nio-8080-exec-1] o.hibernate.engine.spi.IdentifierValue   : ID unsaved-value: 0
2019-09-25 10:05:20.760 TRACE 2643 --- [nio-8080-exec-1] o.h.e.i.AbstractSaveEventListener        : Transient instance of: com.xx.xx.xx.user
2019-09-25 10:05:20.760 TRACE 2643 --- [nio-8080-exec-1] o.h.e.i.DefaultPersistEventListener      : Saving transient instance
2019-09-25 10:05:20.760 TRACE 2643 --- [nio-8080-exec-1] o.h.e.i.AbstractSaveEventListener        : Saving [com.xx.xx.xx.user#<null>]
2019-09-25 10:05:20.760 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.engine.spi.ActionQueue     : Adding an EntityIdentityInsertAction for [com.xx.xx.xx.user] object
2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.engine.spi.ActionQueue     : Adding insert with no non-nullable, transient entities: [EntityIdentityInsertAction[com.xx.xx.user#<delayed:2>]]
2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.engine.spi.ActionQueue     : Adding resolved non-early insert action
2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : Closing session [c0c25dff-2c0a-4996-b352-1ac4d49e48e8]
2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@3cba167b]
2019-09-25 10:05:20.761 TRACE 2643 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] o.h.r.j.i.LogicalConnectionManagedImpl   : Closing logical connection
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] o.h.r.j.i.LogicalConnectionManagedImpl   : Logical connection closed
2019-09-25 10:05:20.762 DEBUG 2643 --- [nio-8080-exec-1] o.h.e.t.internal.TransactionImpl         : committing
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : SessionImpl#beforeTransactionCompletion()
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] org.hibernate.internal.SessionImpl       : Automatically flushing session
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Preparing to commit transaction via JDBC Connection.commit()
2019-09-25 10:05:20.762 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : Transaction committed via JDBC Connection.commit()
2019-09-25 10:05:20.763 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction
2019-09-25 10:05:20.763 TRACE 2643 --- [nio-8080-exec-1] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#afterTransaction
2019-09-25 10:05:20.763 TRACE 2643 --- [nio-8080-exec-1] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources

========================== repo 协议(protocol)是

@存储库 公共(public)接口(interface) UserRepository 扩展 JpaRepository {}

======== 实体是

@Persistent
@Entity
@Table(name = "user")
public class User implements Serializable {

   // private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;    
    @Column(name = "username")
     private String username;

   ===Rest of fields with setters and getters==


@Override
public String toString() {
    return "User [id=" + this.id + ", username=" + this.username +", email="+ this.email+ " 
            + "]";
}

}

服务等级为

@Service
@Persistent
@Transactional(transactionManager="tenantTransactionManager")     
public class UserService {

    @Autowired
    private UserRepository repo;

    public List<User> listAll() {

    return repo.findAll();
    }




public void save(User user) { 

                try {

                    repo.save(user);

            }catch(Exception e) {
                e.printStackTrace();
            }

        }

        public User get(long id) { return repo.findById(id).get();}



public void delete(long id) { repo.deleteById(id); } 

    }

======租户管理器===

@Bean(名称 = "tenantEntityManagerFactory") @ConditionalOnBean(name = "datasourceBasedMultitenantConnectionProvider")

public LocalContainerEntityManagerFactoryBean entityManagerFactory(
       ) {
    //cleaned up on code not directly related

    LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean(); 


    emfBean.setPackagesToScan(
            new String[] { User.class.getPackage().getName(),
                    UserRepository.class.getPackage().getName(),
                    UserService.class.getPackage().getName() });
    emfBean.setJpaVendorAdapter(jpaVendorAdapter());
    Map<String, Object> properties = new HashMap<>();

    properties.put(org.hibernate.cfg.Environment.MULTI_TENANT,
            MultiTenancyStrategy.SCHEMA);

    properties.put(
            org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER,  connectionProvider);

    properties.put(
            org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER,
            tenantResolver);



    properties.put(org.hibernate.cfg.Environment.DIALECT,
            "org.hibernate.dialect.MySQL5Dialect");      

    properties.put(org.hibernate.cfg.Environment.SHOW_SQL, true);
    properties.put(org.hibernate.cfg.Environment.FORMAT_SQL, true);

    properties.put("hibernate.id.new_generator_mappings", "false");
    properties.put("spring.jpa.hibernate.ddl-auto", "none");
    properties.put("spring.jpa.hibernate.autocommit", "true");
    properties.put("spring.datasource.hikari.auto-commit", "true");
    properties.put("hibernate.connection.autocommit", "true"); 

    emfBean.setJpaPropertyMap(properties);   

    return emfBean;
}

} =====和数据源提供者===

公共(public)静态数据源createAndConfigureDataSource( {

    //=======================
    HikariDataSource ds = new HikariDataSource();
    ds.setUsername(xxx);
    ds.setPassword(xxx);
    ds.setJdbcUrl(xxxx);
    ds.setDriverClassName("com.mysql.cj.jdbc.Driver");   

    ds.setConnectionTimeout(20000);

    // Minimum number of idle connections in the pool
    ds.setMinimumIdle(10);
    ds.setMaximumPoolSize(20);
    ds.setIdleTimeout(300000);
    ds.setConnectionTimeout(20000);
    ds.setAutoCommit(true);
    ds.setReadOnly(false);

    return ds;

} }

应用程序属性====

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
logging.level.org.springframework=WARN
logging.level.com=TRACE
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.type=TRACE
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.springframework.jdbc.core.JdbcTemplate=TRACE
    logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
logging.level.org.hibernate=TRACE
logging.level.org.hibernate.type=TRACE
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jpa.hibernate.ddl-auto=none
spring.datasource.hikari.auto-commit =true
spring.jpa.hibernate.connection.autoCommit=true

=====

@Bean(name = "tenantTransactionManager")
    public JpaTransactionManager transactionManager(
            EntityManagerFactory tenantEntityManager) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(tenantEntityManager);
        return transactionManager;
    }

最佳答案

最后,谢谢大家。为此苦苦挣扎了一个星期。次要预选赛 emf 上的 @Bean(name = "tenantTransactionManager") 和 @Qualifier("tenantEntityManagerFactory") 就达到了目的。

是的,停止摆弄自动提交并按照建议删除所有其他事务。非常感谢您的指点。谢谢。

关于mysql - JPA-hib不保存到数据库,而是读取数据库(mysql,Hikari,tomcat 9,spring boot 2.1.8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58102106/

相关文章:

php - 单击按钮更新 SQL 表

php - 具有排序和缺失字段的 GROUP_CONCAT

java - 使用 Mongo Outbound channel 适配器时如何获取 UpsertResult?

java - 如何创建 Hibernate Criteria 以按集合的某些属性进行排序

java - Envers AuditReader 阅读器失败

java - HQL 中的括号未转换为 SQL

mysql - 在具有多个条件的 MySQL 中使用 group by 子句的正确方法是什么?

javascript - 继续按钮和添加按钮

java - Spring-AMQP 事务性发布无异常

java - 已为此响应调用 "getOutputStream()"