java怎么复制别人的数据库_java – 在不同数据库之间复制数据(两者都支持jdbc)...

2023-11-06

我想将测试数据库(mysql)中的所有数据复制到生产数据库(hsqldb)

我使用了hibernate,让它在我的数据库中创建表.所以结构/架构是相同的.

使用mysql dump我可以在两个mysql数据库之间复制数据.但在我的情况下,数据库是不同的,我听说mysqldump生成的sql不能与hsqldb一起使用.由于这两种数据库类型都是由jdbc / hibernate支持的,有没有方法/方法/ java库来复制它们之间的数据?

解决方法:

当然,如果模式相同,则可以以非常简单的方式实现.而且由于您使用相同的Hibernate映射创建了两个数据库,因此它们在实体意义上应该相同.

您只需要两个Hibernate持久性单元(数据源).如果两者都配置正确并且你有特定的EntityManager实例,只需转到Hibernate会话级别 – 据我所知JPA不支持这种方式(如果我错了就纠正我) – 并复制你的源代码实体到您的目标数据库.

因为我喜欢使用Spring,所以我将使用Spring Boot作为以下示例.除了配置之外,复制步骤将与任何Hibernate应用程序一样实现.

我也使用两个PostgreSQL数据库而不是HSQLB来保持简单.如果您的配置分开,只需扩展配置部分,我的持久性单元之间的唯一区别是数据源URL.

首先,我们需要一个实体来测试复制:

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

@Entity

public class StorageEntry {

@Id

@GeneratedValue

private Long id;

private String someValue;

// imagine getters and setter here

}

这是(YAML版本)两个数据源的配置(请参阅第二个数据源url,名为targetDatabaseUrl),配置的所有其他部分将用于两个持久性单元:

spring:

datasource:

url: jdbc:postgresql://localhost/postgres

targetDatabaseUrl: jdbc:postgresql://localhost/postgres2

username:

password:

driver-class-name: org.postgresql.Driver

jpa:

database-platform: org.hibernate.dialect.PostgreSQLDialect

hibernate:

ddl-auto: create-drop

下一部分是数据源的配置类:

import java.util.Properties;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.jdbc.datasource.DriverManagerDataSource;

import org.springframework.orm.jpa.JpaTransactionManager;

import org.springframework.orm.jpa.JpaVendorAdapter;

import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import org.springframework.transaction.PlatformTransactionManager;

@Configuration

public class PersistenceConfig {

@Autowired

private JpaVendorAdapter jpaVendorAdapter;

@Value("${spring.datasource.url}")

private String databaseUrl;

@Value("${spring.datasource.targetDatabaseUrl}")

private String targetDatabaseUrl;

@Value("${spring.datasource.username}")

private String username;

@Value("${spring.datasource.password}")

private String password;

@Value("${spring.datasource.driver-class-name}")

private String driverClassName;

@Value("${spring.jpa.database-platform}")

private String dialect;

@Value("${spring.jpa.hibernate.ddl-auto}")

private String ddlAuto;

@Bean

public EntityManager sourceEntityManager() {

return sourceEntityManagerFactory().createEntityManager();

}

@Bean

public EntityManager targetEntityManager() {

return targetEntityManagerFactory().createEntityManager();

}

@Bean

public EntityManagerFactory sourceEntityManagerFactory() {

return createEntityManagerFactory("source", databaseUrl);

}

@Bean

public EntityManagerFactory targetEntityManagerFactory() {

return createEntityManagerFactory("target", targetDatabaseUrl);

}

@Bean

public PlatformTransactionManager sourceTransactionManager() {

return new JpaTransactionManager(sourceEntityManagerFactory());

}

@Bean

public PlatformTransactionManager targetTransactionManager() {

return new JpaTransactionManager(targetEntityManagerFactory());

}

private EntityManagerFactory createEntityManagerFactory(final String persistenceUnitName,

final String databaseUrl) {

final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

final DriverManagerDataSource dataSource = new DriverManagerDataSource(databaseUrl, username, password);

dataSource.setDriverClassName(driverClassName);

entityManagerFactory.setDataSource(dataSource);

entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);

entityManagerFactory.setPackagesToScan("com.example.model");

entityManagerFactory.setPersistenceUnitName(persistenceUnitName);

final Properties properties = new Properties();

properties.setProperty("hibernate.dialect", dialect);

properties.setProperty("hibernate.hbm2ddl.auto", ddlAuto);

entityManagerFactory.setJpaProperties(properties);

entityManagerFactory.afterPropertiesSet();

return entityManagerFactory.getObject();

}

}

现在,您可以使用不同的实体管理器简单地将数据从一个数据源读取和写入另一个数据源.为了表明这是一个小测试用例:

import static org.hamcrest.CoreMatchers.notNullValue;

import static org.hamcrest.CoreMatchers.nullValue;

import static org.hamcrest.MatcherAssert.assertThat;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import org.hibernate.ReplicationMode;

import org.hibernate.Session;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

import org.springframework.transaction.annotation.Transactional;

import com.example.model.StorageEntry;

@SpringBootTest

@RunWith(SpringRunner.class)

@Transactional(transactionManager = "targetTransactionManager")

public class ReplicationTests {

@PersistenceContext(unitName = "source")

private EntityManager sourceEntityManager;

@PersistenceContext(unitName = "target")

private EntityManager targetEntityManager;

@Test

public void copyEntityBetweenPersistenceUnits() {

final StorageEntry entityToCopy = new StorageEntry();

entityToCopy.setSomeValue("copyMe!");

sourceEntityManager.persist(entityToCopy);

final Long id = entityToCopy.getId();

final StorageEntry sourceEntity = sourceEntityManager.find(StorageEntry.class, id);

assertThat("Entity should exist in default schema!", sourceEntity, notNullValue());

StorageEntry targetEntity = targetEntityManager.find(StorageEntry.class, id);

assertThat("Target schema should not contain the entity, yet!", targetEntity, nullValue());

final Session hibernateSession = targetEntityManager.unwrap(Session.class);

hibernateSession.replicate(sourceEntity, ReplicationMode.OVERWRITE);

targetEntityManager.flush();

targetEntityManager.clear();

targetEntity = targetEntityManager.find(StorageEntry.class, id);

assertThat("Entity should be copied now!", targetEntity, notNullValue());

}

}

就这样.你甚至可以使用一个事务,只决定其中一个持久性单元并利用它的事务管理器,就像测试对@Transactional(transactionManager =“targetTransactionManager”)一样.

标签:java,mysql,hibernate,jdbc,hsqldb

来源: https://codeday.me/bug/20190611/1218620.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java怎么复制别人的数据库_java – 在不同数据库之间复制数据(两者都支持jdbc)... 的相关文章

  • C++17入门经典

    C 17入门经典 注意 第1章 基本概念 第2章 基本数据类型 第3章 处理基本数据类型 第4章 决策 第5章 数组和循环 第6章 指针和引用 第7章 操作字符串 第8章 定义函数 第9章 函数模板 第10章 程序文件和预处理指令 第11章
  • python 修饰器 参数_Python修饰器讲解

    转自 http www cnblogs com rollenholt archive 2012 05 02 2479833 html 文章先由stackoverflow上面的一个问题引起吧 如果使用如下的代码 makebold makeit
  • 语义分割--PANet和Understanding Convolution for Semantic Segmentation

    语义分割 PAN Pyramid Attention Network for Semantic Segmentation FCN作为backbone的结构对小型目标预测不佳 论文认为这存在两个挑战 物体因为多尺度的原因 造成难以分类 针对这
  • J2EE规范技术

    原文 http blog csdn net erikxu archive 2004 12 07 208170 aspx J2EE的13种核心技术 1 JDBC Java Data Base Connectivity java数据库连接 是一
  • Unity3D 中使用OnTiggerEnter遇到的不触发问题

    移动GameObject 绑定BoxCollider Istrigger选中 固定GameObject 绑定BoxCollider 刚体属性 IsKinematic选中 此种情况下 移动GameObject中的OnTriggerEnter
  • 数据结构(1)前言

    1 学习数据结构前 需要掌握结构体和指针的使用 需要了解typedef这个关键字 对这部分知识欠缺的可以查看 C语言结构体详解 何为指针 与数组名有什么区别 2 作为一名想成为嵌入式软件工程师的人而言 很多像电气工程 电子信息等专业的人在大
  • Windows11 文件选择打开方式时卡死 解决

    发生的现象 在 打开方式 窗口的地址栏粘贴应用的地址 gt 打开方式界面卡死 完整步骤 左键点击打开epub文件 gt 跳出 寻找一个应用以打开此 epub文件 gt 选择 在电脑上选择应用 gt 弹出 打开方式 窗口 gt 在 打开方式
  • ❤ 15个基于Vue3.0全家桶的优秀开源项目

    15个基于Vue3 0全家桶的优秀开源项目 Vue Admin Better github https github com chuzhixin vue admin better vue admin better 对比其他来源 admin
  • 雨停了,我将雨伞收起

    天空中已有阳光从厚重的云层间隙射向大地 我将手中的雨伞收起 伞面上留存着的雨滴正沿着伞面的褶皱流下打在地上 我望向远方 一辆汽车沿着自己的轨迹行驶 路边小坑中的积水在车轮的驱赶下纷纷跳上灌木丛的绿叶寻找庇护 一阵清脆的自行车铃在身后响起 一
  • Android BaseQuickAdapter万能适配器

    RecycleView万能适配器 一导入 implementation com github CymChad BaseRecyclerViewAdapterHelper 2 9 24 implementation com android s
  • spring-kafka并行度concurrency在应用集群部署(多个节点)正确设置,附上Kafka Manager监控效果

    我们都知道kafka有topic的概念 为了能够更好的支持水平扩容 topic又分了很多的Partition 消费者负责消费Partition中的消息 一个Partition只能被一个消费者消费 但是一个消费者可以消费多个partition
  • zotero与Obsidian联动笔记(二):zotero拖拽highlights的格式修改

    文章目录 zotero拖拽highlights的格式修改 zotero拖拽highlights的格式修改 方法 两种格式的文本 p highlight quotes true citation comment p blockquote hi
  • unity 3D RPG教程(一)

    目录 声明 1 Create Project 2 Build Level 3 PolyBrush 发挥创意构建场景 4 Navigation 智能导航地图烘焙 5 MouseManager 鼠标控制人物移动 声明 本教程学习均来自U3D中文
  • mysql中ddl语句有哪些_什么是 DDL 语言?其中包括哪些语句?

    展开全部 DDL一般指数据定义语32313133353236313431303231363533e4b893e5b19e31333431373937言 数据库模式定义语言DDL Data Definition Language 是用于描述数
  • 华为OD机试 - 跳格子游戏(Java)

    题目描述 地上共有N个格子 你需要跳完地上所有的格子 但是格子间是有强依赖关系的 跳完前一个格子后 后续的格子才会被开启 格子间的依赖关系由多组steps数组给出 steps 0 表示前一个格子 steps 1 表示steps 0 可以开启
  • C++(14):函数返回类型auto推导

    C 11可以通过结合auto和decltype来动态的声明函数的返回值类型 include
  • plt.style.use设置背景样式

    利用matplotlib绘图设置背景 使用到plt style use 时 对这个参数做一下小结 matplotlib 使用某种样式 plt style use 参数可以是一个 URL 或者路径 指向自己定义的 mplstyle 文件 可以
  • 翁凯c语言作业8-3

    include
  • Vue初始化在HBuilderx中快速搭建

    HBuilderx快速新建VUE项目 一 安装HBuilderx开发工具 官网 HBuilderx HBuilderXH是HTML的第一个字母 Builder是builder X是HBuilder的下一个版本 我们也被称为HX HBuild

随机推荐

  • 01.minio基本介绍搭建使用

    MinIO 是一款基于 Go 语言的高性能 可扩展 云原生支持 操作简单 开源的分布式对象存储产品 官网 https min io 特点 高性能 作为高性能对象存储 在标准硬件条件下它能达到55GB s的读 35GG s的写速率 可扩容 不
  • 随机生成6位随机数(字母+数字)

    package com test public class test public static void main String args String randomcode 用字符数组的方式随机 String model 0123456
  • 人生应该接受的教育

    以下三段话 或许会让你的人生发生一些变化 如果有心改变 一切都不晚 一 比尔 盖茨告诉我们 1 社会充满不公平现象 你先不要想去改造它 只能先适应它 因为你管不了它 2 世界不会在意你的自尊 人们看的只是你的成就 在你没有成就以前 切勿过分
  • openssl基本原理及生成证书

    openssl基本原理及生成证书 openssl基本原理及生成证书 1 基本原理 2 生成证书 一 生成CA证书 1 创建私钥 2 创建证书请求 3 自签署证书 4 将证书导出成浏览器支持的 p12格式 二 生成server证书 1 创建私
  • 6套粒子群算法(内含matlab代码)

    粒子群算法 1 粒子群算法简介 一 粒子群算法的历史 粒子群算法源于复杂适应系统 Complex Adaptive System CAS CAS理论于1994年正式提出 CAS中的成员称为主体 比如研究鸟群系统 每个鸟在这个系统中就称为主体
  • 【C#】如何比较两个对象是否相等(重写Equals方法)

    问题 写单元测试时 需要对比两个对象是否相等 如果使用Assert AreEqual mockclass1 class1 永远无法通过 原因 这里使用了object默认的Equals方法 必须要引用同一个对象 才会返回true 默认的Equ
  • 485通讯与MODBUS的区别与联系

    最近做智能检测的项目 设备 串口之间的通讯比较多 一会儿485 一会儿modbus RTU 有点晕了 这里重新梳理一下RS485 485通讯协议 ModBus通讯协议 Modbus Rtu通讯这几个点的联系和区别 先说RS485吧 RS48
  • C++面试之const和static的联系和区别

    C 中的静态成员和静态函数的参考之前写的博客 C 中的静态成员和静态函数 Littlehero 121的博客 CSDN博客 C 中的全局变量和普通全局变量参考之前写的博客 全局变量 静态全局变量 静态局部变量和普通局部变量的区别 Littl
  • 003 Leaflet 第三个demo 地图上的面积测量

    一 使用到的文件 leaflet src js Leaflet Editable js leaflet measure path js leaflet css leaflet measure path css 面积测量区别于拉框测量面积而言
  • 125-Linux_守护进程

    文章目录 1 什么是Linux守护进程 2 如何创建Linux守护进程 切换当前工作目录到根目录 这样可以避免守护进程在其它目录中的文件被占用 使用fork 函数创建子进程 并在父进程中退出 在子进程中调用setsid 函数创建新的会话组
  • VScode配置PHP运行环境

    VS code配置PHP环境 第一步 配置了PHP环境 如果没有配置php环境的请见上篇个文章 点我 第二步 你需要有VS code 第三步 配置settings json 我们按下shift ctrl p然后搜索settings json
  • 百度联盟百青藤app流量变现

    app流量变现
  • 静态数据成员和静态成员函数(static)

    目录 一 关于静态成员 二 静态数据成员和普通数据成员的共同点 三 为什么要使用静态数据成员 四 关于静态数据成员的初始化 五 静态成员的访问方式 六 静态成员函数 1 与静态数据成员不同 静态成员函数的作用不是为了对象之间的沟通 而是为了
  • Chinchilla Scaling Laws

    Chinchilla Scaling Laws是一组经验原则 用于指导神经网络模型中参数数量的选择和所需训练数据的数量 以实现最佳性能 这些原则表明 为了使模型达到最佳性能 参数数量应与训练集的大小成正比 而训练集的大小应与参数数量的平方成
  • Daniel and Spring Cleaning【数位DP】【Codeforces 1245 F】

    Codeforces Round 597 Div 2 F 这道题化简一下就是让我们求有上下限的2进制数中有几对满足每一位的相 值不为1的对数 那么 首先看到这个1e9就会让人想到数位DP 然后接着就是如何去求的这样一个问题 我们不如将上下限
  • Java8的stream().map()用法

    在Java编码过程中可能会遇到这个场景 遍历一个列表 对列表中的属性进行转换 赋值等操作形成我们想要的一个新列表 通常我们的常规思路就是直接使用for循环 在Java8引入lambda表达式后我们可以使用stream流链式处理的方式 形成新
  • Android之R文件

    首先了解什么是R文件 当 Android 应用程序被编译 会自动生成一个 R 类 其中包含了所有 res 目录下资源 包括布局文件layout 图片文件drawable等 具体的内容如下所示 public final class R 全是以
  • 力扣题---单值二叉树

    题目链接 单值二叉树 先来看下题目与例题 如果二叉树每个节点都具有相同的值 那么该二叉树就是单值二叉树 只有给定的树是单值二叉树时 才返回 true 否则返回 false 示例 1 输入 1 1 1 1 1 null 1 输出 true 示
  • CSV文件在Python中的处理方式

    一 使用Python基本语法读写CSV文件 使用基本语法读取CSV文件中的数据大概思路是 获取文件对象 读取表头 按逗号分隔符拆分表头字段 使用for循环语句获取表体记录数据 拆分后再次写入另一张CSV文件中 如果要将数据写入xls 格式的
  • java怎么复制别人的数据库_java – 在不同数据库之间复制数据(两者都支持jdbc)...

    我想将测试数据库 mysql 中的所有数据复制到生产数据库 hsqldb 我使用了hibernate 让它在我的数据库中创建表 所以结构 架构是相同的 使用mysql dump我可以在两个mysql数据库之间复制数据 但在我的情况下 数据库