两个数据库新增记录后如何令到ID键值不变

本文介绍了一种在Spring+Hibernate框架下实现两台数据库服务器间数据同步的方法,重点解决了通过自定义UUID生成策略来保持主键ID一致性的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   现有两台机,分别装有数据库,对a这台机已经进行了数据更新,现要同步到到b这台机的数据中。现能写数据到b这台机了,但发现a与b这两台机的数据记录除了ID不一样,其它的都一样的,我是用spring+hibernate的,生成主键是用uuid的,

List<Object[]> list = getBaseService().findBySql(sql);
for(Object[] vo : list){
  for(int i=0; i<tables.length; i++){
	if(vo[2].equals(tables[i])){
	String hql = "from "+ pojos[i] +" t where t.id='"+ vo[1] +"'";	
	List<TLink> lists = this.getBaseService().findByHql(hql,null);
	for(TLink obj : lists){
        //这里打印的是a数据库里的,如:4028829a1fcbcd94011fcbe15c9d0005
	System.out.println("$$$$&&&$$$$: "+obj.getId()); 	  
        if(action.equals("insert"))
	   this.getRometeService().insert(obj);		//新增到远程机上
          }		
       }
    }
}



新增后,ID已经是改变了的。如:4028829a1fcbcd94011fcbe5f455000b

问:
有没有办法可以令到新增到b的数据记录与a的数据记录完全一致呢?即令到新增到b数据库的记录,ID主键保持不变。与a的一致

谢谢!

 

 

以上这个问题经过自己的摸索后,终于可以解决了,首先将你的xxx.hbm.xml文件里的主键生成方式更改为你自定义的主键生成方式,如:

 

<id name="id" type="java.lang.String">
<column name="ID" length="50" />
      <generator class="com.webaorta.comm.base.MyUuidGenerato" />
     <!-- <generator class="uuid.hex" /> -->
</id>

 

这里我将hibernate自带的uuid.hex更改为自定义的方法,方法的实现代码如下:

 

package com.webaorta.comm.base;

import java.io.Serializable;

import org.apache.commons.beanutils.MethodUtils;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.UUIDHexGenerator;

public class MyUuidGenerato extends UUIDHexGenerator {

	public Serializable generate(SessionImplementor session, Object obj) {

		String id = null;
		try {
			id = (String) MethodUtils.invokeMethod(obj, "getId", null);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (id == null || id.length() <= 0 || id.equals("")) {
			return super.generate(session, obj);
		}else{
			return id;
		}
	}

}

 

这样,新增到b的数据记录与a的数据记录的ID完全一致了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值