5

目前正在为此苦苦挣扎。

我希望能够使用抽象域类来使我能够使用一些通用代码来执行一些常用的操作。

我的问题是,很多 GORM 操作都是域类上的静态方法,这很困难。想知道这些方法是否有任何非静态等效项,例如我可以使用的“withTransaction”“findById”等。或者如果我可以使用任何“常规魔法”?

顺便说一句,我在 grails 之外使用 GORM,所以我认为我无法访问“静态事务 = 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 回答