2016-03-20 14 views
0

ビジネス層からプレゼンテーション層にJPAエンティティのセットを渡そうとしています。すべてが同じアプリケーションサーバー(Glassfish 4)にデプロイされています。クライアントは.warファイルとしてデプロイされ、ビジネス層は.earとしてejbが到達可能なリモートインタフェースを介して配置されます。このためEJBからPresentation TierにJPAエンティティが正しく渡されない

私は全くロジックと、これらの非常にシンプルな方法があります:この

// EJB 
@Override 
@RolesAllowed("customer") 
public List<CompletedDesign> selectCompletedDesigns() { 

    final Principal callerPrincipal = sessionCtx.getCallerPrincipal(); 

    String name = callerPrincipal.getName(); 
    Customer customer = dataXchangeBean.getCustomerByID(name); 
    List<CompletedDesign> cds = customerBean.selectCompletedDesigns(customer); 
    return cds; 
} 

決勝

クライアント

public List<CompletedDesign> selectCompletedDesigns() { 
     try { 
      List<CompletedDesign> designs = customerFacade.selectCompletedDesigns(); 
      return designs; 
     } catch (EJBException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

とEJBには、JPAエンティティの断片であります。私はcdsリストが正しくEJB側で取得され見ることができますブレークポイントを置くことによって

@Entity 
@Table(name = "COMPLETED_DESIGN") 
@NamedQueries({......}) 
public class CompletedDesign implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 20) 
    @Column(name = "ID") 
    private String id; 
    @Column(name = "DESCRIPTION") 
    private String description; 
    @Column(name = "NAME") 
    private String name; 
    @Column(name = "STATUS") 
    private DesignStatus status;  
    @JoinColumn(name = "CUSTOMER_FK", referencedColumnName = "ID") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Customer customerFk; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "designFk", fetch = FetchType.LAZY) 
    private List<Product> products; 

。最初の質問は、リストの代わりにベクターを取得する理由ですか?私はJPS側からTypedQueryを使用していますが、これはオブジェクトを正しくキャストすることになっていました。

enter image description here

しかし私の主な関心事は、これがある:プレゼンテーション層におけるクライアントクラス自体に、後続のブレークポイントで、完全に、値がすべてNULLで、かつ種類があるオブジェクトを再構築することができないようです行方不明私はここで何が欠けていますか?

enter image description here

+0

は愚かな質問をする嫌いがありますが、エンティティにアクセスしようとするか、これはIDEの問題であるときは、エラーを取得していますか? –

+0

実際には、私はJSFページからオブジェクトにアクセスしており、 '#{completedDesign.description} 'を使って私はビデオには何も得ていません。コンソールにエラーは一切ありません。 – Leonardo

+0

あなたが表示しているコードは、メソッドであるためページをサポートする 'ManagedBean'からのものでなければなりません。私はCustomerFacade EJBの '@ Override'アノテーションを理解していません。それは '@ステートレス'ではないでしょうか? –

答えて

0

あなたは、あなたがそれらにアクセスすると、関連するオブジェクトがロードされることを意味し、あなたが本当にいない場合、彼らはロードされませんように、第一の目的は、(ロードされていないとき、LAZYロードを使用していますそれらを必要とする)。ただし、これは、プライマリオブジェクトがセッションから切り離されたときには機能しません。したがって、遅延の代わりにEAGERを使用するか、トランザクション内で必要なコレクションをロード(アクセス)してから、リモートインタフェース経由で渡す必要があります。

+0

uhm ...問題は関連するエンティティではなく、id、nameなどのフィールドにあります。これはCompletedDesignのプロパティだけです – Leonardo

関連する問題