0

GWT+Hibernateプロジェクトで設計上の決定に直面しています。

会社のエンティティを使用して私の質問を説明します。

@Entity
@Table(name = "Company")
public class Company extends LightEntity implements BaseSerializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;
    @Column(name = "Name")
    private String name;

    @Column(name = "Address")
    private String address;

    @Column(name = "ContactNumber1")
    private String contactNumber1;

    @Column(name = "ContactNumber2")
    private String contactNumber2;

    @Column(name = "EMail")
    private String email;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL)
    private List<CompanyRegistration> companyRegistrations = new ArrayList<CompanyRegistration>();

    public Company() {
    }
    public Company(String code, String name) {
        this.setCode(code);
        this.setName(name);
    }

    // getters & setters
}

有効なCompanyオブジェクトには、常に有効なコードと名前が必要です。残りのプロパティはオプションです。したがって、有効なオブジェクトを確実に作成するために、2つの引数のコンストラクターを提供しました。

今。

私はセッターのデータを検証するために使用されます。これらのセッターはコンストラクターでも使用します。これらにより、新しいオブジェクトが常に有効な状態になります。これは、Hibernateエンティティを実装する際の私の計画です。

ただし、GWT-RPCは、遅延バインディングに使用できるように、デフォルトのnoargsコンストラクターを義務付けています。ただし、これにより、誰でも空のオブジェクトを作成できるようになります。これは、ほとんどのHibernateエンティティでは望ましくありません。たとえば、会社は常にコードと名前で構成されている必要があります。noargsコンストラクターはそのルールに逆らいます。

現在、Hibernateは検証フレームワークの標準(私の記憶が私を裏切らない場合はJSR-303)を実装しています。作成済みのオブジェクトに対して検証を呼び出すことができます。

noargsコンストラクターが原因で問題が発生しました。それが必須でなかったら、私はセッターでの検証を廃止していたでしょう。

セッターで検証を実装すると、無効なオブジェクトができるだけ早く失敗することを意味します。クライアント側のオブジェクトで検証を呼び出す必要はありません。ただし、空のオブジェクト(noargsコンストラクターを使用して作成されたもの)は、その方法で検証できません。それはサービスへの道を開くかもしれません。これは、検証を実装する必要があることを意味します。検証の多くは、サービス層でセッターと同じである可能性があります。

検証フレームワークを実装する場合、クライアント側で作成する各オブジェクトで検証を呼び出す必要があります。検証するのを忘れると、無効な状態でサービスレイヤーに移動する可能性があります。ただし、サービスレイヤーで同じフレームワークを簡単に使用できます。

私が考えた解決策の1つは、とにかくセッターで検証を実装することですが、データベースに永続化するオブジェクトを送信する前に、サービスレイヤーでバリデーターを使用することもできます。そうすれば、クライアント側はセッターによって自動的に制限されます。一方、空のオブジェクトがサーバー側に送信された場合、サービスレイヤーのバリデーターによってキャッチされます。どちらの場合も、例外がユーザーにスローされます。

ただし、これは最善の解決策ではないと思います。なので、入手したいのですが。

編集-私はとにかく注釈を使用してエンティティフィールドに制約を設定しているので、Hibernateはオブジェクトを永続化する前にそれらを検証に使用できます。

4

1 に答える 1

1

問題がGWT-RPCの必須のゼロ引数コンストラクターのみに起因する場合は、開発者がこのコンストラクターにアクセスできないようにすることができます(private必要な場合でも)。GWT-RPCは、その可視性に関係なく、リフレクションを使用してそれにアクセスします。

于 2013-02-04T11:56:31.420 に答える