JFinalModuleGenerator生成model,_MappingKit主键问题

// Composite Primary Key order: USER_ID,USER_ID
		arp.addMapping("F_TL_USER", "USER_ID,USER_ID", TlUser.class);

user_id出现两次,好多表都是这样的,刚开始问题不大,随着开发进度加深,数据表也越来越多,然后好多表_MappingKit都出现了问题,每次都需要手动删除重复的主键或者多余的没有的主键,比如,莫名其妙的多了主键ID。oracle版本11.2.0.1.0 ,暂时没找到原因和解决方法,不知道有没有人知道怎么解决,求告知,谢谢!

评论区

cctvsod

2017-11-23 10:59

我也遇到了,如果你的数据库实例有多个用户,他们存在相同的表,比如每个用户对应一套测试环境,就会有这个问题。我是新建一个MappingKitGenerator的子类:
/**
* JFinal自带的MappingKitGenerator,当一个库下有多个用户,表结构相同时,生成的主键也会重复(比如资源测试环境有resxj30和resxj30a)
*
*/
public class ResMappingKitGenerator extends MappingKitGenerator {

protected String mappingNoPkMethodContentTemplate
= "\t\tarp.addMapping(\"%s\", %s.class);%n";

public ResMappingKitGenerator(String mappingKitPackageName, String mappingKitOutputDir) {
super(mappingKitPackageName, mappingKitOutputDir);
}

@Override
protected void genMappingMethod(List tableMetas, StringBuilder ret) {
ret.append(String.format(mappingMethodDefineTemplate));
for (TableMeta tableMeta : tableMetas) {
boolean isCompositPrimaryKey = tableMeta.primaryKey.contains(",");
if (isCompositPrimaryKey) {
String[] pks = tableMeta.primaryKey.split(",");
Set set = new TreeSet();
set.addAll(Arrays.asList(pks));
String rmRepeatPks = "";
for (String pk : set) {
rmRepeatPks += "," + pk;
}
tableMeta.primaryKey = rmRepeatPks.substring(1);
if (set.size() > 1) {
ret.append(String.format(compositeKeyTemplate, tableMeta.primaryKey));
}
}
String add;
if (StrKit.isBlank(tableMeta.primaryKey)) {
add = String.format(mappingNoPkMethodContentTemplate, tableMeta.name, tableMeta.modelName);
} else {
add = String.format(mappingMethodContentTemplate, tableMeta.name, tableMeta.primaryKey, tableMeta.modelName);
}
ret.append(add);
}
ret.append(String.format("\t}%n"));
}
}

不过这个代码再jfinal3.3下已经编译报错了。。

ddjfinal

2017-11-23 11:28

@cctvsod

public class MappingKitBulid extends MappingKitGenerator {
public MappingKitBulid(String mappingKitPackageName, String mappingKitOutputDir) {
super(mappingKitPackageName, mappingKitOutputDir);
}

@Override
public void generate(List tableMetas) {
for (TableMeta tableMeta : tableMetas) {
String primaryKey = tableMeta.primaryKey;
String[] split = primaryKey.split(",");
List list = new ArrayList<>(Arrays.asList(split));
ConllectionUtils.removeDuplicateWithOrder(list);
String str = "";
if(list.size()==1){
str = list.get(0);
} else if(list.size()>1){
str = list.get(0);
for (int i = 1; i < list.size(); i++) {
str = str + "," + list.get(i);
}
}
tableMeta.primaryKey = str;
}

super.generate(tableMetas);
}


}

ConllectionUtils.removeDuplicateWithOrder 的代码:

// 删除ArrayList中重复元素,保持顺序
public static void removeDuplicateWithOrder(List list) {
Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Object element = iter.next();
if (set.add(element)) {
newList.add(element);
}
}
list.clear();
list.addAll(newList);
}

这样处理下,就不会有重复的主键了哈,我和你的情况一样,数据库多个用户,有的表结构是一样的哈。

JFinal

2017-11-24 17:41

@ddjfinal 非常感谢你的分享 ^_^

热门分享

扫码入社