一般的项目中的表都有这四个字段,创建人、创建时间、最后修改人、最后修改时间。便于我们运营过程中找到 责任人。一般情况下我们需要在service add update remove处加上将这四个字段的值set进去,这样的话代码有点冗余,不便于统一管理,我们可以这样封装。
第一种办法
所有JAVABean或POJO或MODEL实体继承一个Base实体,在Base实体中的get方法里返回相关。这样的话也方便将来序列化。但继承了就会有依赖。
第二种办法
通过反射填充这四个字段。如下代码:
/**
* 通过反射填充表字段。JAVA实体类中的属性:创建人、创建时间、最后修改人、最后修改时间。开发人员只需要在需要set的代码处调用改方法即可。
* @author Belen
*/
public abstract class InitDataUtil {
/**
* 自动填充为"对象o"填充创建人,创建时间,最后修改人,最后修改时间.
* @author Belen
* @date 2016-6-29
*/
public static void fill(Object o){
fillAdd(o);
fillEdit(o);
}
/**
* 自动填充为"对象o"创建人,创建时间
* @author Belen
* @date 2016-6-29
*/
public static void fillAdd(Object o){
Class<?> c = o.getClass();
Field createPersonField = searchFields(c.getDeclaredFields(), "createPerson");
try {
if (createPersonField != null) {
createPersonField.setAccessible(true); // 取消访问检查
createPersonField.set(o, USERNAME); // 获取当前登录人用户名
}
Field createTimeField = searchFields(c.getDeclaredFields(), "createTime");
if (createTimeField != null) {
createTimeField.setAccessible(true); // 取消访问检查
createTimeField.set(o, new Date());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 自动填充为"对象o"最后修改人,最后修改时间.
* @author Belen
* @date 2016-6-29
*/
public static void fillEdit(Object o){
Class<?> c = o.getClass();
Field lastModifyPersonField = searchFields(c.getDeclaredFields(), "lastModifyPerson");
try {
if (lastModifyPersonField != null) {
lastModifyPersonField.setAccessible(true);
lastModifyPersonField.set(o, USERNAME); // 获取当前登录人用户名
}
Field lastModifyTimeField = searchFields(c.getDeclaredFields(), "lastModifyTime");
if (lastModifyTimeField != null) {
lastModifyTimeField.setAccessible(true);
lastModifyTimeField.set(o, new Date());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Helpers for fetchers of one field, method, or constructor
private static Field searchFields(Field[] fields, String name) {
String internedName = name.intern();
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName() == internedName) {
return fields[i];
}
}
return null;
}
}