2013-08-01 48 views
5

目前正在与此挣扎。GORM中的抽象域类:如何处理静态GORM方法

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

我的问题是,很多格姆操作都在域类的静态方法,这使得它很难。想知道这些方法是否有任何非静态等价物,例如“withTransaction”“findById”等我可以使用的。或者,如果有什么“常规魔法”,我可以使用?

顺便说一句,我使用GORM Grails的外面,所以我不认为我有机会获得“静态事务=真正的”服务设置。

任何帮助,将不胜感激。

抽象域类:

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

回答

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) 
    } 
} 
+0

真棒。工作过一种享受。谢谢。 – Ben