EJB3-JSF无法更新实体it excute insert语句为什么?

EJB3-JSF无法更新实体it excute insert语句为什么?,jsf,ejb,Jsf,Ejb,你好,所有新问题我都解决不了 我在下面有一个实体 package com.entity; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Lob; import javax.persi

你好,所有新问题我都解决不了 我在下面有一个实体

package com.entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author Kency
 */
@Entity
@Table(name = "about")
@NamedQueries({
    @NamedQuery(name = "About.findAll", query = "SELECT a FROM About a"),
    @NamedQuery(name = "About.findByAboutTitle", query = "SELECT a FROM About a WHERE a.aboutTitle = :aboutTitle")})
public class About implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "about_title")
    private String aboutTitle;
    @Basic(optional = false)
    @Lob
    @Column(name = "content")
    private String content;

    public About() {
    }

   /* public About(String aboutTitle) {
        this.aboutTitle = aboutTitle;
    }*/

    public About(String aboutTitle, String content) {
        this.aboutTitle = aboutTitle;
        this.content = content;
    }
    public About(String aboutTitle) {
        this.aboutTitle = aboutTitle;
    }

    public String getAboutTitle() {
        return aboutTitle;
    }

    public void setAboutTitle(String aboutTitle) {
        this.aboutTitle = aboutTitle;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (aboutTitle != null ? aboutTitle.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof About)) {
            return false;
        }
        About other = (About) object;
        if ((this.aboutTitle == null && other.aboutTitle != null) || (this.aboutTitle != null && !this.aboutTitle.equals(other.aboutTitle))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.entity.About[aboutTitle=" + aboutTitle + "]";
    }

}
我的无状态bean

package com.DAO;

import com.entity.About;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Kency
 */
@Stateless
@LocalBean
public class AboutDAO {
    @PersistenceContext(unitName = "mcGrawLibPro-ejbPU")
    private EntityManager em;

    public About retrieveAbout(){
       Query query = em.createNamedQuery("About.findAll");
       return (About) query.getSingleResult();
    }

    public void persist(Object object) {
        em.persist(object);
    }

    public About updateAbout(About abouts){
       return em.merge(abouts);

    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

}
我的JSF托管bean控制器

package com.mcgraw.controller;

import com.DAO.AboutDAO;
import com.entity.About;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Kency
 */
@ManagedBean
@SessionScoped
public class AboutController implements Serializable{
    @EJB
    private AboutDAO aboutDAO;
    private About about ;
    private String toolbar = "maxi";




    public String getToolbar() {
        return toolbar;
    }

    public void setToolbar(String toolbar) {
        this.toolbar = toolbar;
    }

    public About getAbout() {
        return aboutDAO.retrieveAbout();
    }


    public void setAbout(About about) {
        this.about = about;
    }


    /** Creates a new instance of AboutController */
    public AboutController() {
       about = new About();
    }

    public void updateAbout(){
        about = aboutDAO.updateAbout(about);
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
            "", "Update ok"));

    }

}
我的JSF页面代码

<p:dialog widgetVar="about" header="About">
    <f:view>
        <h:form>
            <h:inputText value="#{aboutController.about.aboutTitle}"/>
            <p:editor value="#{aboutController.about.content}" widgetVar="editor"/>
            <p:commandButton value="Submit" onclick="editor.saveHTML()" action="#{aboutController.updateAbout}"/>
            <p:messages/>
        </h:form>
    </f:view>

</p:dialog>

数据库类型中的列content是TEXT

您已经将JSF输入元素绑定到
{aboutController.about}
。这将调用getter:

public About getAbout() {
    return aboutDAO.retrieveAbout();
}
然后调用DB查询:

public About retrieveAbout(){
   Query query = em.createNamedQuery("About.findAll");
   return (About) query.getSingleResult();
}

因此,每次调用getter时,您都会得到一个新的About对象。您应该做的是绑定到一个特定的“about”实例,然后将该实例发送回无状态会话Bean进行更新。您将此“about”实例存储为托管Bean的属性,并将其与托管Bean的getter一起返回。

能否更新您的问题以包含异常堆栈跟踪?每个人都有什么想法吗?请帮助我Brian我想更新而不是插入关于对象,我在getter方法
public about getAbout(){//return aboutDAO.retrieveAbout(“about”);this.about=aboutDAO.retrieveAbout(“about”);return about;}
工作正常!!谢谢你对我的支持
public About retrieveAbout(){
   Query query = em.createNamedQuery("About.findAll");
   return (About) query.getSingleResult();
}