2013-08-01 34 views
5

Hiện đang đấu tranh với vấn đề này.Các lớp miền trừu tượng trong GORM: cách đối phó với các phương pháp GORM tĩnh

Tôi đã hy vọng có thể sử dụng lớp miền trừu tượng để cho phép tôi sử dụng một số mã chung để thực hiện một số thao tác thường được thực hiện.

Vấn đề của tôi là rất nhiều thao tác GORM là các phương thức tĩnh trên lớp miền, điều này khiến cho việc này trở nên khó khăn. Đã tự hỏi nếu có bất kỳ tương đương không tĩnh nào của các phương pháp này, ví dụ: "withTransaction" "findById" vv mà tôi có thể sử dụng. Hoặc nếu có bất kỳ "ma thuật groovy" mà tôi có thể sử dụng?

BTW, đang sử dụng GORM bên ngoài grails, vì vậy tôi không nghĩ rằng tôi có quyền truy cập vào cài đặt dịch vụ "static transactional = true".

Mọi trợ giúp sẽ được đánh giá cao.

abstract class miền:

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

và một ví dụ lớp bê tông:

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

    ... 
} 

và một số mã chung theo đó tôi đã hy vọng để có thể tái sử dụng trên một số đối tượng miền, nhưng tất nhiên các Phương thức tĩnh T.xxxx() sẽ không hoạt động.

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

Trả lời

6

Như trong Java, câu trả lời là có khả năng liên quan đến việc đi qua một đối tượng Class để các nhà xây dựng 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

Tuyệt vời. Làm việc một điều trị. Cảm ơn. – Ben

Các vấn đề liên quan