4

私は3つの異なる国で使用されているアプリを持っています。いくつかの国に依存する例外を除いて、ほとんどすべて同じです。たとえば、注文には米国では消費税がありますが、英国ではありません。各国には独自のデータベースがあり、互いに完全に分離されていますが、これらの国固有のプロパティのテーブル構造にはわずかな違いがあります。すべての国が共有する列と同様に、テーブル名は常に同じです。それらを異なるものにするのは余分な列だけです。

現在、結果として、私は実際に3つの別々のアプリケーションを持っており、コードは約80%同一です。何かを開発するたびに、それを個々のアプリケーションにコピーする必要がありますが、これは少し面倒です。

私の計画は、グローバルなアプリケーションを試してから、これを3つのはるかに小さな国固有のものに拡張することです。

私のサービスとdaosの場合、これはグローバルなインターフェースと、ローカルなアプリ間で異なる実装によって処理できます。ローカルアプリは、依存関係としてグローバルを取り込みます。

しかし、私の問題はビジネスオブジェクトにあります。もう一度例として注文を使用すると、私のサービスとdaosの多くはOrderオブジェクトを使用しますが、コードは国全体で同一であるため、グローバルになります。したがって、ある種のGLOBALOrderオブジェクトが必要です。ただし、国によっては、追加のプロパティが利用可能であり、再度保存した場合に保持されることも確認したいと思います。

例として、注文の追跡をチェックし、それを配達済みとしてマークするサービスがあります。このサービスはグローバルであるため、GLOBALOrderオブジェクトにアクセスできます。orderDaoインターフェースがグローバルであるため、orderDao.getOrder(id)が呼び出されます。orderDaoImplはローカルであるため、getOrder(id)メソッドは、実際には、追加のフィールドを含むローカライズされたOrderインスタンスを返します。これがレイヤーを通過すると、再び追跡サービスに到達します。これは、グローバルオーダーを期待しています。つまり、ローカライズされたフィールドは利用できません(このtrackingServiceはそれらを気にしないので、問題ありません。ローカライズされます)。

このグローバル注文のステータスを更新するときは、保存されたときにローカライズされたプロパティが失われないようにする必要があります。

だから私の大きな質問は、どうすればこれを機能させることができるかということです。

オプション1: 「選択的な一時性」を定義する方法はありますか?したがって、すべての可能なプロパティを持つ単一のJavaオブジェクトがあります。各アプリケーションで使用する場合、これらのプロパティのいずれかがデータベーステーブルに存在しない場合は、無視して続行してください。

また

オプション2: グローバルレベルとローカルレベルの両方で使用できる抽象/インターフェイスクラスを使用する方法はありますか?ローカルアプリは、実装されたサブクラスとしてオブジェクトを自動的にキャストしますか?

GLOBALアプリ自体が実際に単独で実行されることはなく、ローカルアプリ内でのみ使用されることを指摘しておく価値があります。しかし、明らかにローカルクラスへの参照を持つことはできません。

助けてくれてありがとう。

4

2 に答える 2

2

最も洗練されたソリューションではないかもしれませんが、としてマップされていないグローバル注文クラスを作成し、@Entityそれを地域注文に含めることができます@Embedded

class GlobalOrder {
    @Column(name = "total")
    private Integer orderTotal;
    ...
}

@Entity
@Table("emeaorder")
class EMEAOrder {
    @Embedded
    private GlobalOrder globalOrder;
    @Column(name = "tax")
    private Integer euSalesTax;
    ...
}
于 2013-03-12T09:51:55.137 に答える
0

わかった。私はこれに対して最もエレガントではないが実行可能な解決策を思いついたと思います。

問題は、グローバルアプリが注文などのローカルビジネスオブジェクトについて認識できるようにすることですが、各国に存在しない可能性のある列にマップされていないことです。

そこで、それらをグローバルプロジェクトに含め、考えられるすべての属性とゲッター/セッターを含めました。

次に、その特定の国で必要なフィールドのみを使用して、それらをローカルプロジェクトに含めます。

グローバルアプリが実際に単独で使用されることはないため、Mavenを使用してライブラリを構築するときは常に、ローカルプロジェクトにあるビジネスオブジェクトを除外します。したがって、ローカルが依存関係としてそれを含める場合、競合はなく、これらのオブジェクトのローカルバージョンのみが含まれます。つまり、Hibernateは列の欠落について文句を言いません。

きれいではありませんが、動作します!

于 2013-03-13T08:50:26.617 に答える