5

現在、これに苦労しています。

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

私の問題は、多くの 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() 静的メソッドは機能しません。

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

1 に答える 1

6

Java の場合と同様に、コンストラクターにClassオブジェクトを渡すことが答えになる可能性があります。AbstractParser

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)
    }
}
于 2013-08-01T10:55:06.770 に答える