目前正在努力解决这个问题。
我希望能够使用抽象域类来使我能够使用一些通用代码来执行一些常用的操作。
我的问题是很多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);
}
}
}
}
答案 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)
}
}