diff --git a/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java b/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java
index f2f9ea4..a17dd5a 100644
--- a/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java
+++ b/src/main/java/com/example/workutils/biz/diff/DiffPlugin.java
@@ -52,6 +52,14 @@ public class DiffPlugin implements Plugin {
@Override
public String[] getMenuOptions() { return MENU_OPTIONS; }
+ @Override
+ public void handleChoice(int choice, Scanner scanner) throws Exception {
+ switch (choice) {
+ case 1: openVisualDiff(); break;
+ default: printInvalidOption(); break;
+ }
+ }
+
// ==================== JavaFX 初始化(复用共享启动器) ====================
private void openVisualDiff() {
diff --git a/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java b/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java
index 5166b02..ea15bb3 100644
--- a/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java
+++ b/src/main/java/com/example/workutils/biz/mybatisgenerator/service/generator/SuppressKeyPlugin.java
@@ -1,22 +1,24 @@
package com.example.workutils.biz.mybatisgenerator.service.generator;
+import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* 自定义插件:抑制 *Key 类的生成,将主键字段直接合并到 PO 类中。
*
- * MBG 默认对含复合主键的表生成两个类:
+ * MBG 默认对含主键的表生成两个类:
*
- * - XXXPO(完整 PO,含所有字段)
+ * - XXXPO extends XXXPOKey(业务字段)
* - XXXPOKey(仅主键字段)
*
- * 本插件在初始化时将 {@code hasPrimaryKeyColumns} 重置为 false,
- * 使 MBG 认为该表没有需要单独提取的主键类,
- * 从而只生成一个包含所有字段的 PO 类。
+ * 本插件通过将 primaryKeyColumns 合并到 baseColumns 中并清空 PK 列表,
+ * 使 MBG 只生成一个包含所有字段的 PO 类。
*/
public class SuppressKeyPlugin extends PluginAdapter {
@@ -34,22 +36,53 @@ public class SuppressKeyPlugin extends PluginAdapter {
}
/**
- * 在表内省完成后,清除主键列标记。
- * MBG 仅当表含复合主键且 {@code getHasPrimaryKeyColumns()==true}
- * 时才会生成独立的 *Key 类;置为 false 后跳过 Key 类生成。
+ * 将主键字段合并到基础字段中,阻止 MBG 生成独立的 *Key 类。
*/
@Override
public void initialized(IntrospectedTable introspectedTable) {
if (!suppressKey) return;
- // 通过反射将 hasInternalPrimaryKey 强制设为 false,
- // 阻止 MBG 生成单独的 PrimaryKey 类
try {
- java.lang.reflect.Field field = introspectedTable.getClass().getDeclaredField("hasInternalPrimaryKey");
- field.setAccessible(true);
- field.set(introspectedTable, false);
+ // 通过反射获取 primaryKeyColumns 和 baseColumns
+ Field pkField = getField(introspectedTable.getClass(), "primaryKeyColumns");
+ Field baseField = getField(introspectedTable.getClass(), "baseColumns");
+
+ if (pkField == null || baseField == null) return;
+
+ pkField.setAccessible(true);
+ baseField.setAccessible(true);
+
+ @SuppressWarnings("unchecked")
+ List pkColumns = (List) pkField.get(introspectedTable);
+ @SuppressWarnings("unchecked")
+ List baseColumns = (List) baseField.get(introspectedTable);
+
+ if (pkColumns == null || pkColumns.isEmpty()) return;
+
+ // 将主键列全部移到 baseColumns 开头
+ List merged = new ArrayList<>(pkColumns);
+ if (baseColumns != null) {
+ merged.addAll(baseColumns);
+ }
+ baseField.set(introspectedTable, merged);
+ pkField.set(introspectedTable, new ArrayList<>());
+
} catch (Exception e) {
// 反射失败时静默忽略,回退到默认行为
}
}
+
+ private static Field getField(Class> clazz, String name) {
+ Field field;
+ try {
+ field = clazz.getDeclaredField(name);
+ } catch (NoSuchFieldException e) {
+ // 可能字段在父类中
+ if (clazz.getSuperclass() != null) {
+ return getField(clazz.getSuperclass(), name);
+ }
+ return null;
+ }
+ return field;
+ }
}