2011-12-11 20 views
2

エンティティはいつ、どこで作成されますか?
XHTMLページがロードされ、マネージドBeanを介してエンティティにアクセスすると、それらは作成されますか?
または、マネージドBeanで自動的に作成されますか?
マネージドBeanのコンストラクタから手動で作成する必要がありますか?エンティティはいつJava EE Webアプリケーションで作成されるのですか?

エンティティは次のようになり、以下のコード(。いくつかの必要なコードがコピーされていない可能性があります)

を参照してください。

public class PersonalInfo implements Serializable { 
    @Size(max = 50) 
    @Column(name = "FIRST_NAME", length = 50) 
    private String firstName; 

    // some getters and setters 
} 

Webページは次のようになります。

<h:form> 
    <h:outputText value="first name"/> 
    <h:inputText value="#{personalInforController.personalInfo.firstName}" /> 

    <h:commandButton value="hit me" 
     action="#{personalInforController.create}" 
     immediate="true"/> 
</h:form> 

とバッキングビーンは:

@Named(value = "personalInfoController") 
@SessionScoped 
public class PersonalInforController { 
    @EJB 
    PersonalInfoFacade ejbFacade; 
    PersonalInfo personalInfo; 
    String defaultPage = "index"; 

    public String create() { 
     try { 
      ejbFacade.create(personalInfo); 
      return "prepareCreate"; 
     } catch (Exception e) { 
      return "success"; 
     } 
    } 
} 

答えて

4

与えられたコード例では、実際にはcreateアクションが動作しないようです。その前にバッキングBeanによってエンティティを作成する必要があります。

単純なエンティティの場合、コンストラクタまたは@PostConstructメソッドが機能します。たとえば、

@Named(value = "personalInfoController") 
@SessionScoped 
public class PersonalInforController { 

    @EJB 
    PersonalInfoFacade ejbFacade; 
    PersonalInfo personalInfo; 
    String defaultPage = "index"; 

    @PostConstruct 
    public void init() { 
     personalInfo = new PersonalInfo(); 
    } 

    public String create() { 
    try { 
     ejbFacade.create(personalInfo); 
     return "prepareCreate"; 
    } catch (Exception e) { 
     return "success"; 
    } 
} 

コードに関する注意事項。 Beanが@SessionScopedであると宣言することは、非常に疑わしく、おそらく間違っている可能性が高いです。 personalInfoが2つのタブまたはウィンドウで編集されている場合、あなたは怪我をすることになります。 Beanを@ViewScopedにすることをお勧めします(CDIの場合は、Seam3によって作成された別の拡張機能があります。この拡張機能を使用できない場合は、@Namedではなく@ManagedBeanの使用を検討してください)。

また、インスタンス変数をプライベートに宣言し、ejbFacadeの方がより適切な名前(personalInfoFacadeなど)を指定できます。私はまた、immediateがcommandButton上に必要かどうか疑問に思っています。また、outputTextは明らかに与えられたinputTextのラベルなので、outputLabelとfor属性の使用を検討してください。

+0

説明に非常に感謝します!それで、コンストラクタやatPostConstructで装飾されたメソッドから手動で作成する必要があります。私はnetbeansによって自動生成されたコードのためちょうどちょっと混乱している。とにかく、もう一度感謝します。助けをありがとう! –

関連する問題