2011-12-11 18 views
14

2つのクラス(マネージドBean &エンティティBean)の作成を避けるため、Bean(CDI)という名前のBeanをエンティティBean(@Entity)&という名前で表示する例がたくさんあります。クライアント&の両方のサーバーで実行できます。管理対象のBean(バッキングBean)またはエンティティBeanの使用方法

だから私は、単一のクラスを使用するかしないが、どんな問題があるか、私は私の管理Beanまたはサービス層は、管理対象Beanからのデータを使用してエンティティBeanを作成持つべきか?

答えて

14

@Namedまたは@ManagedBean注釈は、典型的には、JSFにおける表現言語によって参照されるときに豆容器(CDI/JSF)は、オンデマンドでBeanのインスタンスを作成させるために使用されます。

@Entity Beanの場合、任意の新しいインスタンスを取得するだけではあまり意味がありません。 @Entityは永続的なアイデンティティに非常に強く結びついています。このようなエンティティは、Entity Managerから要求され、Beanコンテナからは要求されません。

典型的なパターンは、(一般的に@StatelessのJava EEで順番にある)サービスへの呼び出しを行うという名前です(スリム)バッキングBeanを持つことです。サービスはエンティティを返します。

いくつかの非常に些細なシステムでは、人々は時にはサービスに名前をつけ、ELに直接利用できるようにします。しかし、最終的には、 "バッキングコード"に顔のメッセージを生成させたり、純粋なビジネスサービスの関心事ではならないすべてのものを処理(テーブル)する選択をしたいことがよくあります。

別の一般的なショートカットは、バッキングBeanは、直接(実体を取得例えばエンティティ・マネージャ)ビジネス・コードを含むせています。これにより、ビジネスコードは再利用するのが難しくなりますが、アプリが簡単で再利用の必要がない場合は、それを取り除くことができます。

しかし、エンティティをバッキングBeanにすることはまれであり、一般的なJava EEパターンには当てはまりません。

バッキングBeanはエンティティを直接返すことができるので、Bean検証は引き続き使用できます。ずっと前に奇妙な「散らばった/集まる」パターンが必要ではありません(第2例のthis questionを参照してください)。

など。 SomeEntity.name上の制約、それが有効となりますがある場合

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
>  
    <h:body> 
     <h:form>  
      <h:inputText value="#{backingBean.myEntity.name}" />       
      <h:commandButton value="Save" action="#{backingBean.save}" /> 
     </h:form>    
    </h:body> 
</html> 

:@Entity注釈付きBean内SomeEntityを想定し

@ViewScoped 
@ManagedBean 
public class BackingBean { 

    private SomeEntity myEntity; // + getter 

    @EJB 
    private Service service; 

    @PostConstruct 
    public void init() { 
     myEntity = service.getSomeEntity(); 
    } 

    public void save() { 
     service.save(myEntity); 
     FacesContext.getCurrentInstance().addMessage(..., ...); 
    } 
} 

は、豆の検証は、今のようにfaceletに使用することができます。あなたのポストのための

+0

おかげで、それは便利ですが、あなたは我々が使用して書き込みJSFアプリケーションの適切な方法を理解したり、あなたには、いくつかの方向に私を指すことができれば、それは素晴らしいことだできるJSFコードの完全な例を持っています。 – Rachel

+0

+1は非常に明確な答えで、問題の幅広い文脈も提供します –

+0

"バッキングBeanはエンティティを直接返すことができるので、Beanの検証は引き続き使用できます。ずっと前にうんざりした/パターンを集める "私はあなたがこれについて詳しく説明できるのだろうかと思います。この「散乱/ギャザー」パターンとは何ですか?これは似ています:私は、ビューとモデルのより大きな分離を主張する人がいることを聞いたことがあるので、FaceletsフィールドをバッキングBeanのプロパティ(プリミティブ)にマップし、ステートレスサービスを使用してプロパティを受け取り、エンティティを移入して保持します。 – DavidS

関連する問題