From 037eeaecb56d2d374fe86dd602c884bf663e1f6f Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Sat, 31 Jul 2021 21:56:49 +0800 Subject: [PATCH] =?UTF-8?q?perf[orm]:=20entity=E7=B1=BB=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=9A=84=E6=99=BA=E8=83=BD=E8=AF=AD=E6=B3=95=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/orm/manager/OrmManager.java | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/orm/src/main/java/com/zfoo/orm/manager/OrmManager.java b/orm/src/main/java/com/zfoo/orm/manager/OrmManager.java index da5e8eb2..c9e4e044 100644 --- a/orm/src/main/java/com/zfoo/orm/manager/OrmManager.java +++ b/orm/src/main/java/com/zfoo/orm/manager/OrmManager.java @@ -372,21 +372,60 @@ public class OrmManager implements IOrmManager { var idField = idFields[0]; // idField必须用private修饰 AssertionUtils.isTrue(Modifier.isPrivate(idField.getModifiers()), "实体类Entity[{}]的id必须是private私有的", clazz.getSimpleName()); - if (clazz.isPrimitive() || Number.class.isAssignableFrom(clazz)) { - var entityInstance = ReflectionUtils.newInstance(clazz); - var idFieldType = idField.getType(); - if (idFieldType.equals(int.class) || idFieldType.equals(Integer.class)) { - ReflectionUtils.setField(idField, entityInstance, RandomUtils.randomInt()); - } else if (idFieldType.equals(long.class) || idFieldType.equals(Long.class)) { - ReflectionUtils.setField(idField, entityInstance, (long) RandomUtils.randomInt()); - } else if (idFieldType.equals(float.class) || idFieldType.equals(Float.class)) { - ReflectionUtils.setField(idField, entityInstance, (float) RandomUtils.randomDouble()); - } else if (idFieldType.equals(double.class) || idFieldType.equals(Double.class)) { - ReflectionUtils.setField(idField, entityInstance, (float) RandomUtils.randomDouble()); - } else if (idFieldType.equals(String.class)) { - ReflectionUtils.setField(idField, entityInstance, RandomUtils.randomString(10)); - } + + // 随机给id字段赋值,然后调用id()方法,看看两者的返回值是不是一样的,避免出错 + var entityInstance = ReflectionUtils.newInstance(clazz); + var idFieldType = idField.getType(); + Object idFiledValue = null; + if (idFieldType.equals(int.class) || idFieldType.equals(Integer.class)) { + idFiledValue = RandomUtils.randomInt(); + } else if (idFieldType.equals(long.class) || idFieldType.equals(Long.class)) { + idFiledValue = RandomUtils.randomLong(); + } else if (idFieldType.equals(float.class) || idFieldType.equals(Float.class)) { + idFiledValue = (float) RandomUtils.randomDouble(); + } else if (idFieldType.equals(double.class) || idFieldType.equals(Double.class)) { + idFiledValue = RandomUtils.randomDouble(); + } else if (idFieldType.equals(String.class)) { + idFiledValue = RandomUtils.randomString(10); + } else { + throw new RunException("orm现在仅支持int long float double String"); } + + ReflectionUtils.makeAccessible(idField); + ReflectionUtils.setField(idField, entityInstance, idFiledValue); + var idMethodOptional = Arrays.stream(ReflectionUtils.getMethodsByNameInPOJOClass(clazz, "id")) + .filter(it -> it.getParameterCount() <= 0) + .findFirst(); + AssertionUtils.isTrue(idMethodOptional.isPresent(), "实体类Entity[{}]必须重写id()方法", clazz.getSimpleName()); + var idMethod = idMethodOptional.get(); + ReflectionUtils.makeAccessible(idMethod); + var idMethodReturnValue = ReflectionUtils.invokeMethod(entityInstance, idMethod); + AssertionUtils.isTrue(idFiledValue.equals(idMethodReturnValue), "实体类Entity[{}]的id字段的返回值[field:{}]和id方法的返回值[method:{}]不相等,请检查id()方法实现是否正确" + , clazz.getSimpleName(), idFiledValue, idMethodReturnValue); + + // 校验gvs()方法和svs()方法的格式 + var gvsMethodOptional = Arrays.stream(ReflectionUtils.getAllMethods(clazz)) + .filter(it -> it.getName().equals("gvs")) + .filter(it -> it.getParameterCount() <= 0) + .findFirst(); + + var svsMethodOptional = Arrays.stream(ReflectionUtils.getAllMethods(clazz)) + .filter(it -> it.getName().equals("svs")) + .filter(it -> it.getParameterCount() == 1) + .filter(it -> it.getParameterTypes()[0].equals(long.class)) + .findFirst(); + // gvs和svs要实现都实现,不实现都不实现 + if (gvsMethodOptional.isEmpty() || svsMethodOptional.isEmpty()) { + AssertionUtils.isTrue(gvsMethodOptional.isEmpty() && svsMethodOptional.isEmpty(), "实体类Entity[{}]的gvs和svs方法要实现都实现,不实现都不实现", clazz.getSimpleName()); + return; + } + + var gvsMethod = gvsMethodOptional.get(); + var svsMethod = svsMethodOptional.get(); + var vsValue = RandomUtils.randomLong(); + ReflectionUtils.invokeMethod(entityInstance, svsMethod, vsValue); + var gvsReturnValue = ReflectionUtils.invokeMethod(entityInstance, gvsMethod); + AssertionUtils.isTrue(gvsReturnValue.equals(vsValue), "实体类Entity[{}]的gvs方法和svs方法定义格式不正确", clazz.getSimpleName()); } private void checkEntity(Class clazz, HashMap, Set>> entitySubClassMap) {