通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能(hibernate自动建表配置)

  本篇文章为你整理了通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能(hibernate自动建表配置)的详细内容,包含有hibernate 自动建表 hibernate自动建表配置 hibernate 创建表 创建hibernate项目 通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能,希望能帮助你了解 通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能。

  最近做toB、toG业务,普遍要去适配各种国产数据库,所以不得不用hibernate,过去这么多年一直都是用mybatis+mysql,现在重拾hibernate,专注跨数据库,感兴趣的加关注。

  需求背景:

  最近做一个数据库备份还原功能,需要支持跨库同步,比如mysql的数据及表结构整库批量同步到SqlServer(虽然Navicat有此功能,但是Navicat不支持一些新的国产数据库,况且,这个Navicat不能集成到项目里,用户使用不方便)。

  功能分析:

  1、需要同步表结构,不同的数据库DDL语句不兼容性。但是,hibernate框架中,entity已经定义了表结构,hibernate会帮我们适配各种数据库,所以不用备份表结构(sql: create table xxx ...),直接通过hibernate在数据库生成表;

  2、常见的数据备份是备份insert into table ... 这样的sql语句。这样做,备份文件体积大,且不是批量插入,性能一般,特殊格式的字段在不同数据库还存在兼容问题。所以我们可以通过hibernate,只备份数据,将数据转为json格式存储,然后用hibernate将数据入库。

  实现思路:

  1、通过entityManager获取实体entity;

  2、通过entity查询对应表所有数据;

  3、解析前端传参,组装新的数据库链接;

  4、根据数据库链接和获取到的实体,创建hibernate工厂(通过entity创建表);

  5、再次通过遍历实体,组装批量insert sql(ps:hibernate批量插入性能很差,原则是还是saveOrUpdate);

  6、从创建的hibernate工厂获取sessionFactory,执行批量插入sql;

  关键代码:

  1、通过批量jpa备份数据

  

@Resource

 

  private EntityManager entityManager; //注入entityManager

  // ---------------------------------

  // 通过entityManager获取所有实体

  Set EntityType ? entityTypes = entityManager.getMetamodel().getEntities();

  // 遍历实体

  entityTypes.parallelStream().forEach((EntityType ? entity) - {

   // 根据实体创建 JpaRepository

   SimpleJpaRepository simpleJpaRepository = new SimpleJpaRepository(entity.getJavaType(), entityManager);

   // 直接读表数据

   List ? list = simpleJpaRepository.findAll();
// 可以将list转为json存储...以下省略...

   });

 

  2、通过jpa手动创建表

  

  

 private void initEntityManager() {

 

   Map String, String settings = new HashMap ();

   settings.put(AvailableSettings.DRIVER, "com.mysql.jdbc.Driver");
settings.put(AvailableSettings.DIALECT, "com.ut.msfw1a.common.core.hibernate.dialect.MsfwMySQLDialect");

 

  

 settings.put(AvailableSettings.URL, "jdbc:mysql://127.0.0.1"); // 填入要还原的数据库jdbc信息

 

   settings.put(AvailableSettings.USER, "root");

   settings.put(AvailableSettings.PASS, "password");

   settings.put(AvailableSettings.ORDER_INSERTS, "true");

   settings.put(AvailableSettings.ORDER_UPDATES, "true");

   settings.put(AvailableSettings.STATEMENT_BATCH_SIZE, "10000");

   settings.put(AvailableSettings.SHOW_SQL, "false");

   settings.put(AvailableSettings.BATCH_VERSIONED_DATA, "ture");

   settings.put(AvailableSettings.HBM2DDL_AUTO, "update");

   settings.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");// 表命名规则

   ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build();

   MetadataSources metadataSources = new MetadataSources(serviceRegistry);

   entityTypes.forEach((EntityType ? type) - {//entityTpyes是备份的时候从entity中取到的

   metadataSources.addAnnotatedClass(type.getJavaType()); // 添加要还原的entity

   Metadata metadata = metadataSources.getMetadataBuilder().build(); // 创建hibernate工厂,这一步,会自动生成表

   SessionFactory sessionFactory = metadata.buildSessionFactory();

   sessionFactory.openSession();

   entityManager = sessionFactory.createEntityManager(); // 这样就根据jdbc信息创建了一个自己的entityManager

   }

 

  3、还原数据

  存数据的时候,json数据文件用表名存储

  

  可以这样根据表名获取到对应的entity

  

Optional EntityType ? entityTypeOptional = entityTypes.stream().filter(et - et.getName().equals(tableName)).findFirst();
if (!entityTypeOptional.isPresent()) {
 return;
}
EntityType ? entityType = entityTypeOptional.get();
根据表名,和新创建的entityManager还原数据

 

  

SimpleJpaRepository simpleJpaRepository = new SimpleJpaRepository(entity.getJavaType(), entityManager);

 

  

simpleJpaRepository.batchSave(list)

 

  以上就是通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能(hibernate自动建表配置)的详细内容,想要了解更多 通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: