0

データベースに 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 つの質問があります。

  1. 私が間違っているのは何ですか?
  2. 最初の 20 文字を表示する適切な方法は何ですか? ProductsTableBackingBean.java、ProductsDao.java、またはここに示すように Entity クラスに直接配置する必要がありますか?
4

2 に答える 2

3

データベースにある可能性があるため、以下の例のように、その前に値null productDescriptionを確認する必要があります。nullsubstring

@javax.persistence.Column(name = "productDescription")
@Basic
public String getProductDescription() {
        return productDescription !=null ? productDescription.substring(0,20) : "";
}

getProductDescription()ただし、短い説明を返すために、そのままにして新しいものを作成することをお勧めします。それは次のようになります。

    @javax.persistence.Column(name = "productDescription")
    @Basic
    public String getProductDescription() {
            return productDescription;
        }

    public String getShortDescription() {
        return productDescription !=null ? productDescription.substring(0,20) : "";
    }
于 2013-06-12T22:18:39.893 に答える
2

適切な方法は、UI レイヤーで値をトリミングすることです。エンティティ フィールドは、完全に初期化される前にアクセスされる可能性があります。これにより、null 値をトリミングしようとするケースが発生します。

于 2013-06-12T20:22:49.473 に答える