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