データベースに Products というテーブルがあり、JPA 2.0 を使用してアクセスしています。
Glassfish サーバーで JSF 2.0 を使用しています。
私は次のようなレイヤーを持っています:
products.xhtml -> ProductsBackingBean.java -> ProductsDao.java -> Produtcs.Java
ここに products.xhtml があります:
<h:form>
<p:dataTable var="product" value="#{productsBackingBean.allProducts}">
<p:column headerText="Product Code">
<h:outputText value="#{product.productCode}"/>
</p:column>
<p:column headerText="Product Description">
<h:outputText value="#{product.productDescription}"/>
</p:column>
</p:dataTable>
</h:form>
ProductsBackinBean.java は次のとおりです。
package com.tugay.maythirty.model;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class ProductsBackingBean implements Serializable {
@EJB private ProductsDao productsDao;
public List<Products> getAllProducts(){
return productsDao.getAllProducts();
}
}
ProductsDao.Java:
package com.tugay.maythirty.model;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.persistence.*;
import java.util.List;
@Stateful
public class ProductsDao {
@PostConstruct
public void init() {
System.out.println("Init");
}
public List<Products> allProducts;
public List<Products> getAllProducts() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence");
EntityManager em = emf.createEntityManager();
if (allProducts == null) {
TypedQuery<Products> typedQuery = em.createQuery("Select p from Products p", Products.class);
allProducts = typedQuery.getResultList();
}
return allProducts;
}
}
そして、Products.Java は次のとおりです。
@Entity
public class Products {
private String productCode;
private String productDescription;
@javax.persistence.Column(name = "productCode")
@Id
public String getProductCode() {
return productCode;
}
public void setProductCode(String productCode) {
this.productCode = productCode;
}
@javax.persistence.Column(name = "productDescription")
@Basic
public String getProductDescription() {
return productDescription.substring(0,20);
}
public void setProductDescription(String productDescription) {
this.productDescription = productDescription;
}
@Override
public int hashCode() {
// some hashcode here. not relevant.
}
}
したがって、重要な部分は次のとおりです。
productDescription.substring(0,20) を返します。
私のテーブルでは、製品説明の最初の 20 文字のみを表示したいと考えています。ただし、例外があります。
例外 javax.servlet.ServletException 根本原因 javax.ejb.NoSuchEJBException 根本原因 javax.ejb.NoSuchObjectLocalException: EJB が存在しません。セッションキー: 3890c00100a81f-3a922970-0
ProductDao の init() メソッドにブレークポイントがあると、それが呼び出されていることがわかります。ただし、ProductBackingBean が productDao.getAllProducts を呼び出すと、productDao が null のように見えます。
また、ログには次のことがわかります。
com.tugay.maythirty.model で。EJB31_Generated_ ProductsDao _Intf_ Bean _.getAllProducts (提供元不明) com.tugay.maythirty.model.ProductsBackingBean.getAllProducts(ProductsBackingBean.java:14)
substring(0,20) を削除すると、すべて問題ありません。
2 つの質問があります。
- 私が間違っているのは何ですか?
- 最初の 20 文字を表示する適切な方法は何ですか? ProductsTableBackingBean.java、ProductsDao.java、またはここに示すように Entity クラスに直接配置する必要がありますか?