2011-10-18 7 views
1

私はOpenJPAを使用しており、別のカスタムエンティティを参照する方法が不思議でした。人と住所があるとしましょう。どちらも私のモデルエンティティです。JPA - JSF書き込みアクセス用のカスタム属性/オブジェクトを挿入またはインスタンス化しますか?

Personはどのようにして住所を正しく参照しますか?

この方法:

@Entity 
public class Person { 

    @Column 
    @Inject 
    Address adr; 
} 

かのように:

@Entity 
public class Person { 

    @Column 
    Address adr = new Address(); 
} 

私はむしろ注入またはインスタンス化したい理由は、私はこのようなアドレスにアクセスしたとき、私は、nullポインタ例外を参照してくださいです:#{myBean.personA.adr.street} adrは、オブジェクトが既存のレコードから読み込まれず、新しいレコードを作成するときにnullを返します。

エンティティでどのように問題を解決しますか?私はsthが足りませんか?私はopenJPAとWebbeansを使用します。

答えて

0

明示的に新しいPersonを作成している時点で作成します。

@ManagedBean 
@ViewScoped 
public class Register { 

    private Person person; 

    @PostConstruct 
    public void init() { 
     person = new Person(); 
     person.setAddress(new Address()); 
    } 

    // ... 
} 

それとも、あなたはそれを繰り返す必要がないように、あるいは、Personで仕事をする:

@ManagedBean 
@ViewScoped 
public class Register { 

    private Person person; 

    @PostConstruct 
    public void init() { 
     person = Person.create(); 
    } 

    // ... 
} 

私にやって2つのオプションを提供します

@Entity 
public class Person { 

    public static Person create() { 
     Person person = new Person(); 
     person.setAddress(new Address()); 
     return person; 
    } 

    // ... 
} 
+0

良い解決策、とそのようなもの。ありがとうございます – jonnie119

+0

ようこそ。 – BalusC

0

変数のデフォルト値を初期化するためにコンストラクタを定義することができます。この方法では、オブジェクトが作成されるたびに、データベースから値を適用する前にコンストラクタを最初に実行します。これは、アドレスオブジェクトがデータベースにNULL値を持たないと仮定して動作します。 一般に、データ・エントリをまだ検証していないか、または表にNULL制約がない場合、データが潜在的にNULL値を持つ可能性があるため、オブジェクト・トラバーサルを参照する前にヌル・チェックを使用します。

0

エンティティをJSFページから直接参照することはお勧めしません。フォームデータをいくつかの中間オブジェクトに保存してから、一時オブジェクトからエンティティを初期化して永続化するいくつかのEJBサービスを呼び出すことができます。

関連する問題