GORM中的抽象域类:如何处理静态GORM方法

时间:2013-08-01 10:43:12

标签: grails groovy gorm

目前正在努力解决这个问题。

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

我的问题是很多GORM操作都是域类上的静态方法,这使得它很难。想知道这些方法是否存在任何非静态等价物,例如: “withTransaction”“findById”等我可以使用。或者,如果有任何“groovy magic”我可以使用?

BTW,我在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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分: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)
    }
}