2013-08-01 11 views
5

Obecnie walczymy z tym.Klasy domen abstrakcyjnych w GORM: jak radzić sobie ze statycznymi metodami GORM

Miałem nadzieję, że będę mógł użyć abstrakcyjnej klasy domeny, aby umożliwić mi użycie ogólnego kodu do wykonywania często wykonywanych operacji.

Mój problem polega na tym, że wiele operacji GORM to metody statyczne w klasie domeny, co utrudnia. Zastanawialiśmy się, czy istnieją niestatyczne odpowiedniki tych metod, np. "withTransaction" "findById" itp., z których mógłbym skorzystać. A może jest jakaś "groźna magia", której mógłbym użyć?

BTW, używam GORM poza grails, więc nie sądzę, że mam dostęp do ustawienia "static transactional = true".

Każda pomoc zostanie doceniona.

klasa abstrakcyjna domeny:

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

i przykład beton klasy:

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

    ... 
} 

a niektóre rodzajowy kod której Miałem nadzieję, aby móc ponownie użyć całej niektórych obiektów domeny, ale oczywiście Metody statyczne T.xxxx() nie będą działać.

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

Odpowiedz

6

jak w Javie, odpowiedź może obejmować przepuszczanie Class obiektu do konstruktora 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

Awesome. Pracował uczta. Dzięki. – Ben

Powiązane problemy