现有两台机,分别装有数据库,对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完全一致了。