0

間違った単語を使用している可能性があるため、ビジネスオブジェクト(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を追加するだけですが、これは適切ではありません...

4

1 に答える 1

1

あなたの問題は、実際には、継承と、あるクラス階層から並列階層への変換に関するオブジェクト指向の問題です。これとHibernateマッピングのデータベースモデリングはすでに解決されており、訪問者の実装に明らかに問題はありません。マップされたクラス階層にビジターパターンを適用したくないというだけのことで、2つの階層間の変換で問題が発生しました。

現状では、コードの一部は、 etcにCatBO対応することを知り、オブジェクトのプロパティが実際にである場合、それを含むオブジェクトのプロパティが実際にはであるということを知る責任を負う必要があります。それを考えると、返されるインスタンスのタイプを判別できる必要があるため、どちらかまたはリフレクションのいずれかを使用しないようにする方法がわかりません。あなたの反対は何ですか?クラス名を取得して「BO」を追加することは非常に厄介で醜いですが、明らかに機能させることはできますが、私は同意します。しかし、その責任が正しいものを使用して選択することによって適切なものを取り、返すことである単一の方法CatPenAnimalCatPenBOAnimalBOCatBOAnimalinstanceofinstanceofAnimalAnimalBOinstanceofBO私見の状況では、クラスは悪いことではありません。

私が尋ねる質問は、なぜこのようにあるクラス階層から別のクラス階層にマッピングしているのかということです。マップされたクラスにメソッドを追加したくacceptない、そしてそれは「良くない」とあなたは言いましたが、なぜあなたがこのように感じるのか正当化されていません。すでに提示したオプションよりも悪いですか?マップされたクラス階層にビジターパターンを追加することにより、実際にはビジネスロジックをそこに埋め込む必要はなく、ビジターパターンを使用して階層全体にビジネスロジックを適用できるようになります。したがって、ビジネスロジック層には単純で一般的な訪問者の実装が含まれ、マップされたクラスまたはドメイン層はPOJOと基本的な訪問者の実装です。

于 2012-08-14T15:27:48.080 に答える