0

データベース内のレコードを表す基本クラス Record があります。レコードを拡張する Customer クラスと Job クラスがあります。これまでアノテーションを使用したことはありませんが、カスタム アノテーションを作成し、Customer クラスで Jobs オブジェクトを返すメソッドをマークして、Customer を保存するときに 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;
    }
}

これは可能ですか?誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

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;
}

上記は、手元のオブジェクトで AlsoSaveRecord アノテーションをスキャンし、適用可能なメソッドを返します。その後、アノテーションが付けられた結果として返されたメソッドを呼び出すことができます。呼び出しは、キャストまたは何かを行うことができるオブジェクトを返します。

注釈内で「レコード タイプ」を定義するように要求に応じて編集します (つまり、@AlsoSaveRecord(MyRecord.class);

上記のメソッドは、注釈が付けられたときに定義されたクラスである recordType を取得できるようになりました

于 2013-04-22T07:35:30.733 に答える