5

多くの子をラップする複雑なオブジェクトにバインドする必要があるフォームがあります。このフォームをロードする前に、多くのステートメントとメソッドnewを呼び出すメソッドですべての子オブジェクトを初期化する必要があります。setter多くのフォームやその他の複雑なオブジェクトに対してこのシナリオを繰り返す

initializeEmployeeメソッドよりも優れた戦略はありますか?

例えば:

@Entity
public class Employee {
    Integer Id;
    Contract contract;
    Name name;
    List<Certificate> list;
    // getter and setters
}

@Entity
public class Contract {
    String telephoneNum;
    String email;
    Address address;
    // getter and setters
}

@Entity
public class Address {
    String streetName;
    String streetNum;
    String city;
}

public class Name {
    String fName;
    String mName;
    String lName;
    // getter and setters
}

// And another class for certificates

public initializeEmployee() {
    Employee emplyee = new Employee();

    Name name = new Name();
    employee.setName(name);

    Contract contract = new Contract();
    Address  address = new Address();
    contract.setAddress(address);
    employee.setContract(contract);

    // set all other employee inner objects, 
}

編集: 以下の回答によると、最適な回答はないようです。ただし、エンティティconstructorまたはFactoryデザイン パターンを使用できます。

しかし、両方のソリューションは、すべてのフィールド戦略を必須フィールドとオプションフィールドで初期化する際の私の他の問題を解決しません。

例:Name必要に応じて(つまり、名前オブジェクト属性が空の場合、従業員エンティティは永続化されませんが、Contractエンティティはオプションです。空のContractオブジェクトをデータベースに永続化できないため、作成する必要がありますnull最初に永続化する前に、次のように永続化後に再初期化します

// Set Contract to null if its attributes are empty
Contract contract = employee.getContract()
if(contract.getTelephoneNum().isEmpty && contract.getEmail().isEmpty() && contract.getAddress().isEmpty()){
    empolyee.setContract(null);
}

employeeDAO.persist(employee);
// reinitialize the object so it could binded if the the user edit the fields.
employee.setContract(new Contract());
4

4 に答える 4

7

null 値を使用しても意味がない場合は、エンティティにコンストラクター (結局はその役割です) を追加して、これらのフィールドをインスタンス化できます。

コンストラクターを追加したくない場合の別の方法は、静的ファクトリー メソッドを追加して、initializeEmployee() のように見えるが、潜在的なパラメーターを持ち、Employee オブジェクトを返す Bean をインスタンス化することです。http://en.wikipedia.org/wiki/Factory_method_pattern

同様に、コレクションをインスタンス化することもできます。これは、null コレクションにはおそらく意味がないためです (ただし、空のコレクションには意味があります)。

エンティティに動作を追加できます。Martin Fowler http://www.martinfowler.com/bliki/AnemicDomainModel.htmlによってアンチパターンと見なされている Anemic Domain Model にロックされないでください。

編集

dao.persist(entity) を使用しているようです: おそらく JPA を使用しています。その場合は、オブジェクト グラフ (フロント側) を変更せず、Employee の EntityListener (永続層) を追加することをお勧めします。Hibernate EntityListener のリンクは次のとおりです (JPA 機能であるため、別のフレームワークを使用しても心配ありません) http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/listeners.html

EntityListener を使用すると、永続化の前後に小さな「aop のような」アクションを追加できます。これにより、ドメインとフロント レイヤーで null 値を処理する必要がなくなり、すべてのエンティティがどのような場合にも適合することが保証されます (より適切な検証)。

PrePersist では、すべてのコードを追加して null 値をチェックし (おそらくドメイン クラスのカスタム メソッド "isEmpty()" を使用)、必要に応じてフィールドを null 化します。PostPersist で、新しいオブジェクトを追加します。

于 2013-10-10T12:32:11.980 に答える
2

冗長性がまったく軽減されるかどうかはわかりませんが、これは UI の問題であるため、flow.xml で編集可能なオブジェクトを初期化し、DB に保存する前にすべてを Employee インスタンスにまとめることができます。

<on-start>
    <evaluate expression="new foo.bar.Name()" result="flowScope.employeeName" />
    <evaluate expression="new foo.bar.Contract()" result="flowScope.contract" />
    <evaluate expression="new foo.bar.Address()" result="flowScope.address" />
</on-start>
于 2013-10-17T10:21:22.757 に答える