我可能会使用错误的词,所以当我说业务对象(BO)我的意思是一个类的引用与Hibernate映射到数据库表的类,以及作为商业逻辑。休眠,子分类和访问者模式
我面临的问题是实例化没有使用反射或instanceof子类的权利BO。
例如,假设我有一个Pen-table,其中有一个动物表的引用,它又有两个子表Cat和Dog(所有的一对一引用)。这些类看起来有点像这样:
Pen p = ... // Get or load from database
PenBO pbo = new PenBO();
pbo.setPen(p);
然后,我使用的类是这样的::
public class Pen {
private Animal a;
// Getters and setters
}
public class Animal {
// Getters and setters
}
public class Dog extends Animal {
// Getters and setters
}
public class Cat extends Animal {
// Getters and setters
}
public class PenBO {
private Pen p;
public AnimalBO getAnimalBO() { ... }
}
public interface Action {
void visit(DogBO dbo);
void visit(CatBO cbo);
}
public class Sound implements Action {
void visit(DogBO dbo) { ... }
void visit(CatBO cbo) { ... }
}
public interface AnimalBO {
void accept(Sound s);
}
public class DogBO implements AnimalBO {
Dog d;
void accept(Sound s) {
s.visit(this);
}
}
public class CatBO implements AnimalBO {
Cat c;
void accept(Sound s) {
s.visit(this);
}
}
然后,我刚刚与BO的实例他们像这样的BO的获得的方法里面工作
pbo.getAnimalBO().accept(new Sound());
这是我正在研究的getAnimalBO-方法。我希望它根据Pen的Animal实例返回BO的正确实例。
我“可以”使用instanceof检查当前笔的实际动物,但这显然不是很漂亮。我想到的另一种选择是使用反射来获取类名并在之后添加“BO”并获得该类的实例,但它也非常难看。
我试过围绕getAnimalBO包装另一个访客模式,但它不能选择正确的访问方法而不投射,我不想将接受方法添加到非BO类。
如果没有聪明的方法来让该方法有效地工作,那么核心的问题就是错误的?我还没有真正找到Hibernate的最佳实践。 Hibernate和访问者模式的一些例子只是将accept方法添加到映射类中,这不能很好...
感谢您的回答!对不起,我没有给出不想用instanceof或relfection去解决的原因。这是正常的,它需要一个额外的地方更新时,添加新的类或不得不留下一个新的类最后需要“BO”的说明。我认为你对映射类中的accept方法进行了很好的说明,我可能会用它。它并不觉得它在映射类中只有getter和setter,除了创建额外的BO类以外,还为每个新的Animal子类添加一个instanceof。 – user1540134 2012-08-14 22:06:04