間違った単語を使用している可能性があるため、ビジネスオブジェクト(BO)とは、Hibernateを使用してデータベーステーブルにマップされたクラスへの参照を持つクラスと、ビジネスロジックを意味します。
私が直面している問題は、リフレクションやinstanceofを使用せずに、サブクラスに適切なBOをインスタンス化することです。
たとえば、動物テーブルへの単一の参照を持つペンテーブルがあり、次に2つのサブテーブルCatとDog(すべて1対1の参照)があるとします。クラスは次のようになります。
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のgetメソッド内で次のようにインスタンス化します。
Pen p = ... // Get or load from database
PenBO pbo = new PenBO();
pbo.setPen(p);
次に、次のようなクラスを使用します。
pbo.getAnimalBO().accept(new Sound());
私が取り組んでいるのはgetAnimalBOメソッドです。ペンの動物インスタンスに基づいて、BOの正しいインスタンスを返すようにします。
現在のペンから実際の動物をチェックするinstanceofを使用することは「できました」が、それは明らかにきれいではありません。私が考えていたもう1つの方法は、リフレクションを使用してクラス名を取得し、後で「BO」を追加してそのインスタンスを取得することでしたが、これもかなり醜いです。
getAnimalBOの周りに別のビジターパターンをラップしようとしましたが、キャストせずに適切なビジターメソッドを選択することはできず、非BOクラスにaccept-メソッドを追加したくありません。
そのメソッドを効率的に機能させるための賢い方法がない場合、コアに何か問題がありますか?Hibernateのベストプラクティスは実際には見つかりませんでした。Hibernateとビジターパターンのいくつかの例は、マップされたクラスにaccept-methodsを追加するだけですが、これは適切ではありません...