2

私のシステムは、Java で記述されたバックエンド部分で構成され、WSDL と XSD を使用してコントラクトファーストで定義された一連の Web サービスを公開します。Web サービスを介して転送されるデータの中には、多数の商品タイプがあります (正確には、さまざまな種類の銀行口座です)。フロントエンドは Grails Web アプリケーションです。バックエンドによってホストされるデータと操作を使用および公開します。セキュリティ上の理由から、フロントエンド自体にはデータベースがありません。すべてのデータはバックエンドに保存されます。かなり標準的なアーキテクチャ。

現在、一連の製品は大きく、成長しており、不安定です。各製品タイプは、Web アプリケーションのユーザー インターフェイスで CRUD する必要があります。プロダクト タイプの XSD 仕様をドメイン タイプとして使用し、それらのビューとコントローラを生成するように Grails に指示できれば幸いです。

大規模な実験と多くの Web ブラウジングを行った後でも、このパズルの解決策はまだ見つかっていません。私は、Grails で約 1 年分のプロとしての経験があります。ヘルプやアイデアをいただければ幸いです。

いくつかの詳細:

製品タイプは単純な POJO データ キャリアです。簡単な例:

package jaxbgenerated;

public class Product1 {
    protected Account from;
    protected Account to;
    protected String name;
    // + getters and setters
}

public class Product2 {
    protected List<Account> accounts;
    protected String name;
    // + getters and setters
}

public class Account {
    protected String id1;
    protected String id2;
    // + getters and setters
}

「アカウント」は製品タイプではなく、JAXB によって生成されたタイプであることに注意してください。製品には、String、int、Date などの単純なデータ型のプロパティに加えて、このようなものを含めることができますが、他の製品型を含めることはできません。

私が目指している最終結果は、Grails で生成されたフォームであり、ユーザーは Product1 インスタンスを編集して、その構成アカウントを編集するためのネストされたフォームを使用できます。Product2 についても同様です。

私の考えは、最初に JAXB で生成された型ごとに Grails ドメイン クラスを手動でコーディングすることです。

//in grails-app/domain:
 
import utilities.Copier
 
class Product1 extends jaxbgenerated.Product1 {
    Product1(jaxbgenerated.Product1 jaxb) {
        Copier.copy(jaxb, this)
    }

    static constraints = {
    }
}

ここには定型コードが少しありますが、私が我慢できる以上のものはありません。Copier.copy() 関数は、バックエンドからフェッチされた jaxbegenerated.Product インスタンスを、Grails で使用できる Product1 インスタンスに変換するために (私が思うに) 必要です。jaxb ソースで jaxb によって生成されたプロパティを再帰的に探し、それらの値を対応する Grails ドメイン タイプにコピーします。コンストラクターは、バックエンドからデータを取得するレイヤーから呼び出されます。

制約ブロックを使用して、必要に応じてセマンティック制約を手動で追加できます。たとえば、「from」アカウントと「to」アカウントが同じではない場合などです。

次に、このように構築されたすべての Grails ドメイン クラスのコントローラーとビューを生成し、アプリケーションを実行します。そして、例外のスタックを取得します:

Caused by MappingException: Could not determine type for: Account, at table:
product1_type, for columns: [org.hibernate.mapping.Column(from)]

ここでの問題は、Product1 の「from」および「to」プロパティが Account 型ではなく、jaxbgenerated.Account 型であることだと思います。

私はさまざまなアプローチを試みましたが、役に立ちませんでした。いくつかのメモ:

  1. 前述したように、すべてのデータ ストレージはバックエンドで行われるため、Grails の GORM/Hibernate の側面は必要ありません。したがって、ドメイン クラスに "static mapWith = "none" を追加しようとしましたが、役に立ちませんでした。
  2. 「static mapping = {from type: Account }」を追加して、Product1 のアカウントのタイプを Hibernate に明示的に伝えようとしましたが、それもうまくいきませんでした。

ヘルプやアイデアをいただければ幸いです。

/Jan Reher、Systematic A/S、デンマーク

4

1 に答える 1

0

このsimpledbと概念が似ているデータベースプラグインを作成したと思います

于 2012-10-12T13:22:25.377 に答える