2013-08-01 11 views
5

現在、この問題を解決するには苦労しています。GORMにおける抽象的なドメインクラス:静的なGORMメソッドの扱い方

抽象的なドメインクラスを使用して、いくつかの一般的な操作を実行するための汎用コードを使用できるようにしたいと考えていました。

私の問題は、GORM操作の多くがドメインクラスの静的メソッドであることです。これは困難です。これらのメソッドの非静的等価物があるかどうか疑問に思っていました。 "withTransaction" "findById"などを使用することができます。それとも、私が使うことができる「グルーヴィー・マジック」があれば?

私はGrailsの外でGORMを使用しているので、 "static transactional = true"サービス設定にアクセスできないと思います。

ご協力いただければ幸いです。

抽象ドメインクラス:

@Entity 
public abstract class Entity<K> { 
    public abstract String toNiceString(); 
    public K id; 

    public K getId(){ 
     return id; 
    } 

    public void setId(final K id){ 
     this.id = id; 
    } 
} 

と例具体的なクラス:

@Entity 
@EqualsAndHashCode 
class Person extends Entity<String> { 
    String name 
    String summary 
    LocalDate birthDate 
    LocalDate deathDate 
    String occupations 

    ... 
} 

と私はいくつかのドメインオブジェクト間で再利用できるように期待していたことにより、いくつかの一般的なコード、もちろんのT.xxxx()静的メソッドは機能しません。 Javaで同様

public abstract class AbstractParser<T extends Entity> { 

    protected void parseAndSavePages(){ 

     //Do some parsing 
     ... 

     T.withTransaction { 
      if(T.findEntityById(entity.id)){ 
       println "Already exists!"; 
      } else { 
       entity.save(failOnError: true); 
      } 
     } 
    } 
} 

答えて

6

、答えはAbstractParserコンストラクタにClassオブジェクトを渡す関与する可能性があります。

public abstract class AbstractParser<T extends Entity> { 

    protected Class<T> entityClass 

    protected AbstractParser(Class<T> entityClass) { 
     this.entityClass = entityClass 
    } 

    protected void parseAndSavePages(){ 

     //Do some parsing 
     ... 

     // Groovy treats instance method calls on a Class object as calls 
     // to static methods of the corresponding class 
     entityClass.withTransaction { 
      if(entityClass.findEntityById(entity.id)){ 
       println "Already exists!"; 
      } else { 
       entity.save(failOnError: true); 
      } 
     } 
    } 
} 

class PersonParser extends AbstractParser<Person> { 
    public PersonParser() { 
     super(Person) 
    } 
} 
+0

驚くばかりです。治療をしました。ありがとう。 – Ben

関連する問題