Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 在h:dataTable中更新后未反映在JPA实体中的更改_Jsf_Jpa_Datatable - Fatal编程技术网

Jsf 在h:dataTable中更新后未反映在JPA实体中的更改

Jsf 在h:dataTable中更新后未反映在JPA实体中的更改,jsf,jpa,datatable,Jsf,Jpa,Datatable,我正在使用Eclipse和Glassfish 3.0。虽然我以前也做过类似的事情,但这项技术还是很新的。非常简单,实际上是将一个数据表绑定到一个支持bean。添加方法和删除方法——问题在于我调用的更新方法。我似乎看不到组件(HtmlInputText)中的更改,更不用说将数据传递回表了 下面是我的数据表代码(以及jsf页面) 确定-更新我的代码以遵循示例。我尝试将EJB合并到场景中,如下所示 package net.bssuk.timesheets.ejb; import java.util

我正在使用Eclipse和Glassfish 3.0。虽然我以前也做过类似的事情,但这项技术还是很新的。非常简单,实际上是将一个数据表绑定到一个支持bean。添加方法和删除方法——问题在于我调用的更新方法。我似乎看不到组件(HtmlInputText)中的更改,更不用说将数据传递回表了

下面是我的数据表代码(以及jsf页面)

确定-更新我的代码以遵循示例。我尝试将EJB合并到场景中,如下所示

package net.bssuk.timesheets.ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import net.bssuk.timesheets.model.Category;
@Stateless
public class CategoryEJB implements CategoryEJBRemote {

@PersistenceContext(unitName="timesheets1")
private EntityManager em;

@Override
public List<Category> findCategories() {
    // TODO Auto-generated method stub
    System.out.println("find categories");
    Query query = em.createNamedQuery("findAll");
    return query.getResultList();
}

@Override
public Category createCategory(Category category) {
    // TODO Auto-generated method stub
    em.persist(category);
    return category;
}

@Override
public Category udpateCategory(Category category) {
    // TODO Auto-generated method stub
    return em.merge(category);
}

@Override
public void deleteCategory(Category category) {
    // TODO Auto-generated method stub
        em.remove(em.merge(category));
}

}
package net.bssuk.timesheets.ejb;
导入java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
导入net.bssuk.timesheets.model.Category;
@无国籍
公共类CategoryEJB实现CategoryJBRemote{
@PersistenceContext(unitName=“时间表1”)
私人实体管理者;
@凌驾
公共列表查找类别(){
//TODO自动生成的方法存根
System.out.println(“查找类别”);
Query Query=em.createNamedQuery(“findAll”);
返回query.getResultList();
}
@凌驾
公共类别createCategory(类别){
//TODO自动生成的方法存根
em.persist(类别);
退货类别;
}
@凌驾
公共类别和公共类别(类别){
//TODO自动生成的方法存根
返回em.merge(类别);
}
@凌驾
公共无效删除类别(类别){
//TODO自动生成的方法存根
em.remove(em.merge(category));
}
}
我的EJB在下面

package net.bssuk.timesheets.ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import net.bssuk.timesheets.model.Category;
@Stateless
public class CategoryEJB implements CategoryEJBRemote {

@PersistenceContext(unitName="timesheets1")
private EntityManager em;

@Override
public List<Category> findCategories() {
    // TODO Auto-generated method stub
    System.out.println("find categories");
    Query query = em.createNamedQuery("findAll");
    return query.getResultList();
}

@Override
public Category createCategory(Category category) {
    // TODO Auto-generated method stub
    em.persist(category);
    return category;
}

@Override
public Category udpateCategory(Category category) {
    // TODO Auto-generated method stub
    return em.merge(category);
}

@Override
public void deleteCategory(Category category) {
    // TODO Auto-generated method stub
        em.remove(em.merge(category));
}

}
package net.bssuk.timesheets.ejb;
导入java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
导入net.bssuk.timesheets.model.Category;
@无国籍
公共类CategoryEJB实现CategoryJBRemote{
@PersistenceContext(unitName=“时间表1”)
私人实体管理者;
@凌驾
公共列表查找类别(){
//TODO自动生成的方法存根
System.out.println(“查找类别”);
Query Query=em.createNamedQuery(“findAll”);
返回query.getResultList();
}
@凌驾
公共类别createCategory(类别){
//TODO自动生成的方法存根
em.persist(类别);
退货类别;
}
@凌驾
公共类别和公共类别(类别){
//TODO自动生成的方法存根
返回em.merge(类别);
}
@凌驾
公共无效删除类别(类别){
//TODO自动生成的方法存根
em.remove(em.merge(category));
}
}

有人能告诉我这种看起来是否合适吗?还是我完全失去了它的阴谋

如我所见,您忘记了
。这对于保存输入非常必要。

如我所见,您忘记了
。这对于保存输入非常必要。


public List getCollection(){
//this.emf=Persistence.createEntityManagerFactory(“时间表1”);
//System.out.println(“获取集合”);
试一试{
this.emf=Persistence.createEntityManagerFactory(“时间表1”);
this.em=this.emf.createEntityManager();
Query Query=this.em.createNamedQuery(“findAll”);
this.collection=query.getResultList();
退回此项。收藏;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
您正在getter方法中加载列表。这是一个非常糟糕的主意。getter应该只是bean属性的访问点,而不是做一些业务工作。在bean的生命周期中,可以多次调用getter。每次调用都会命中DB,并且JSF在表单提交期间更新的本地
集合
属性将在稍后再次被覆盖。这毫无意义

在(post)构造函数方法或操作(侦听器)方法中执行业务作业。绝对不是在一个getter中。下面是一个最低启动示例,其中包含一些代码改进:


(注意,在EL中传递参数是受支持的,因为EL 2.2(Servlet 3.0的一部分),Glassfish 3是Servlet 3.0容器,所以当
web.xml
正确声明为符合Servlet 3.0规范时,它应该明确支持它)

@ManagedBean
@ViewScoped//绝对不要使用会话范围。我不确定CDI方法,所以这里是JSF示例。
公共类Bean{
私人名单类别;
私有类;
@EJB
私人类别服务类别服务;
@施工后
公共void init(){
categories=categoryService.list();
newCategory=新类别();
}
公共无效添加(){
categoryService.add(newCategory);
init();
}
公共作废删除(类别){
categoryService.delete(类别);
init();
}
公共作废更新(类别){
类别服务更新(类别);
init();
}
公共列表getCategories(){
退货类别;
}
公共类别getNewCategory(){
返回新类别;
}
}
应该是这样。另见:


public List getCollection(){
//this.emf=Persistence.createEntityManagerFactory(“时间表1”);
//System.out.println(“获取集合”);
试一试{
this.emf=Persistence.createEntityManagerFactory(“时间表1”);
this.em=this.emf.createEntityManager();
Query Query=this.em.createNamedQuery(“findAll”);
this.collection=query.getResultList();
退回此项。收藏;
}捕获(例外e){
e、 printStackTrace();
返回null;
package net.bssuk.timesheets.model;
import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the CATEGORIES database table.
 * 
*/
@Entity
@Table(name="CATEGORIES")
@NamedQuery(name="findAll", query = "SELECT c from Category c")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;

private String description;

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

public Category() {
}

public String getDescription() {
    return this.description;
}

public void setDescription(String description) {
    this.description = description;
}

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}

}
package net.bssuk.timesheets.ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import net.bssuk.timesheets.model.Category;
@Stateless
public class CategoryEJB implements CategoryEJBRemote {

@PersistenceContext(unitName="timesheets1")
private EntityManager em;

@Override
public List<Category> findCategories() {
    // TODO Auto-generated method stub
    System.out.println("find categories");
    Query query = em.createNamedQuery("findAll");
    return query.getResultList();
}

@Override
public Category createCategory(Category category) {
    // TODO Auto-generated method stub
    em.persist(category);
    return category;
}

@Override
public Category udpateCategory(Category category) {
    // TODO Auto-generated method stub
    return em.merge(category);
}

@Override
public void deleteCategory(Category category) {
    // TODO Auto-generated method stub
        em.remove(em.merge(category));
}

}
package net.bssuk.timesheets.ejb;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import net.bssuk.timesheets.model.Category;
@Stateless
public class CategoryEJB implements CategoryEJBRemote {

@PersistenceContext(unitName="timesheets1")
private EntityManager em;

@Override
public List<Category> findCategories() {
    // TODO Auto-generated method stub
    System.out.println("find categories");
    Query query = em.createNamedQuery("findAll");
    return query.getResultList();
}

@Override
public Category createCategory(Category category) {
    // TODO Auto-generated method stub
    em.persist(category);
    return category;
}

@Override
public Category udpateCategory(Category category) {
    // TODO Auto-generated method stub
    return em.merge(category);
}

@Override
public void deleteCategory(Category category) {
    // TODO Auto-generated method stub
        em.remove(em.merge(category));
}

}
@ManagedBean
@ViewScoped // Definitely don't use session scoped. I'm not sure about CDI approach, so here's JSF example.
public class Bean {

    private List<Category> categories;
    private Category newCategory;

    @EJB
    private CategoryService categoryService;

    @PostConstruct
    public void init() {
        categories = categoryService.list();
        newCategory = new Category();
    }

    public void add() {
        categoryService.add(newCategory);
        init();
    }

    public void delete(Category category) {
        categoryService.delete(category);
        init();
    }

    public void update(Category category) {
        categoryService.update(category);
        init();
    }

    public List<Category> getCategories() {
        return categories;
    }

    public Category getNewCategory() {
        return newCategory;
    }

}