java - 使用注释来级联保存对象

时间:2013-04-22 04:07:47

标签: java oop

我有一个基类Record,它代表数据库中的记录。我有Customer和Job类来扩展记录。我以前从未使用过注释,但我想我想做的是创建一个自定义注释并在我的Customer类中标记一个返回其Jobs对象的方法,所以我知道在我保存客户时将Jobs对象保存到数据库。

像这样的东西

class Record{

    private int id;

    public void save(){

        //look up all methods in the current object that are marked as @alsoSaveList,
        //call those methods, and save them as well. 

        //look up all methods in the current object that are marked as @alsoSaveRecord,
        //call those methods, and save the returned Record.
    }
}


class Customer extends Record{

    @alsoSaveList
    public List<Job> jobs(){
        return list of all of customers jobs objects;
    }
}

class Job extends Record{

    @alsoSaveRecord
    public Customer customer(){
        return its customer object;
    }
}

这可能吗?有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

我同意,通常如果您使用ORM,那么您可以让JPA或Hibernate处理此问题。但是,如果您想要一个程序化的响应,就像您在这里提到的一个简单的示例:

定义注释: AlsoSaveRecord.class

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AlsoSaveRecord { 
   // The record class type
   Class<?> value();
}

查找要调用的方法的代码:您可以添加到上面的类示例中的代码

public void save() {
  List<Method> toSaveRecords = findMethodsAnnotatedWith(AlsoSaveRecord.class, obj);
  for (Method rec : toSaveRecords) {
    AlsoSaveRecord anno = rec.getAnnotation(AlsoSaveRecord.class);
    Class<?> recordType = anno.value();
    Object objToSave = rec.invoke(obj);
  }
}

List<Method> findMethodsAnnotatedWith(Class<? extends Annotation> annotation, Object instance) 
{
  Method[] methods = instance.getClass().getDeclaredMethods();
  List<Method> result = new ArrayList<Method>();
  for (Method m : methods) {
    if (m.isAnnotationPresent(annotation)) {
      result.add(m);
    }
  }
  return result;
}

以上内容将扫描Object中的AlsoSaveRecord注释并返回任何适用的方法。然后,您可以调用返回的那些由于注释而导致的方法。调用将返回您可以强制转换的对象或使用。

按要求编辑以在注释中定义“记录类型”(即@AlsoSaveRecord(MyRecord.class);

上面的方法现在可以获取recordType,它是带注释时定义的类