Hibernate JSF更新实体不';我不能正常工作

Hibernate JSF更新实体不';我不能正常工作,hibernate,jsf-2,Hibernate,Jsf 2,我正在尝试使用JSF2和Hibernate开发一个web应用程序,对于服务器,我使用JBossAS7。我有一个实体幻灯片和一个bean幻灯片动作。我可以成功地将实体添加到数据库中并删除它们,但在编辑实体时会带来麻烦。在编辑页面上,我填充我的实体并显示给用户进行编辑,当用户提交时,只有实体的最后一个属性得到更新 这是幻灯片 @Entity public class Slide extends AbstractEntity<Integer>{ private static final

我正在尝试使用JSF2和Hibernate开发一个web应用程序,对于服务器,我使用JBossAS7。我有一个实体幻灯片和一个bean幻灯片动作。我可以成功地将实体添加到数据库中并删除它们,但在编辑实体时会带来麻烦。在编辑页面上,我填充我的实体并显示给用户进行编辑,当用户提交时,只有实体的最后一个属性得到更新

这是幻灯片

@Entity
public class Slide extends AbstractEntity<Integer>{

private static final long serialVersionUID = 1L;

private String title;
private String description;
private Image image;
private String link;
private Page page;
private boolean showOnFeed;
private boolean approved;
private boolean cropped;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    System.out.println( getId() + " = TITLE = " + title );
    this.title = title;
}   

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    System.out.println( getId() + " = DESC = " + description );
    this.description = description;
}

@OneToOne
public Image getImage() {
    return image;
}

public void setImage(Image image) {
    this.image = image;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

@OneToOne
public Page getPage() {
    return page;
}

public void setPage(Page page) {
    System.out.println( getId() + " = PAGE = " + page.getHeading() );
    this.page = page;
}
@Column(name="show_on_feed")
public boolean isShowOnFeed() {
    return showOnFeed;
}

public void setShowOnFeed(boolean showOnFeed) {
    this.showOnFeed = showOnFeed;
}

public boolean isApproved() {
    return approved;
}

public void setApproved(boolean approved) {
    this.approved = approved;
}

public boolean isCropped() {
    return cropped;
}

public void setCropped(boolean cropped) {
    this.cropped = cropped;
}
}
@实体
公共类幻灯片扩展了抽象实体{
私有静态最终长serialVersionUID=1L;
私有字符串标题;
私有字符串描述;
私有图像;
私有字符串链接;
私人网页;
私有布尔showOnFeed;
私营机构获批准;
私有布尔裁剪;
公共字符串getTitle(){
返回标题;
}
公共无效集合标题(字符串标题){
System.out.println(getId()+“=TITLE=“+TITLE”);
this.title=标题;
}   
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
System.out.println(getId()+“=DESC=“+description”);
this.description=描述;
}
@奥内托内
公共映像getImage(){
返回图像;
}
公共void setImage(图像){
这个图像=图像;
}
公共字符串getLink(){
返回链接;
}
公共无效设置链接(字符串链接){
this.link=link;
}
@奥内托内
公共页面getPage(){
返回页面;
}
公共无效设置页(第页){
System.out.println(getId()+“=PAGE=“+PAGE.getHeading());
this.page=page;
}
@列(name=“在订阅源上显示订阅”)
公共布尔值isShowOnFeed(){
返回showOnFeed;
}
公共void设置showOnFeed(布尔值showOnFeed){
this.showOnFeed=showOnFeed;
}
公共布尔值已批准(){
已批准退货;
}
已批准的公共文件集(已批准的布尔值){
这个.已批准的=已批准的;
}
公共布尔值isCropped(){
复种;
}
公共空间设置裁剪(布尔裁剪){
this.crapped=裁剪过的;
}
}
SliderAction.class

@Named
@RequestScoped
public class SliderAction {

private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("db");
private EntityManager entityManager;

private int id;
private int pageId;
private Integer coordinates[] = new Integer[4];
private Image image;    
private Slide slide = new Slide();
private List<Slide> slides = new ArrayList<Slide>();
private List<Slide> publicSlides = new ArrayList<Slide>();
private UploadedFile uploadedFile;  
private boolean externalLink = false;
private boolean editable = true;

public String add() {
    return "add";
}

public String addSlide() {

    ImageAction imageAction = new ImageAction();                    
    imageAction.upload(uploadedFile, false);

    image = imageAction.getImage();
    slide.setImage( image );
    slide.setCropped( false );      

    startTransaction();
    if( !externalLink ) {
        slide.setPage(entityManager.find(Page.class, pageId));
    }
    entityManager.persist(image);
    entityManager.persist(slide);
    endTransaction();
    closeTransaction();

    setId(slide.getId());

    return "details";
}


public void editSlide() {

    System.out.println(slide);

    startTransaction(); 
    entityManager.merge(slide);
    endTransaction();
    closeTransaction();
}   
public void deleteSlide() {

    startTransaction();
    slide = (Slide)entityManager.find(Slide.class, id);
    entityManager.remove(slide);
    endTransaction();
    closeTransaction();

    slides.remove(slide);

    ImageAction imageAtion = new ImageAction();
    imageAtion.delete(slide.getImage().getUniqueName(), slide.getImage().getThumb());
}

public void makeEditable() {
    editable = true;
}

public void startTransaction() {
    entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
}

public void endTransaction() {
    entityManager.getTransaction().commit();
}

public void closeTransaction() {
    entityManager.close();
}

public int getId() {
    return id;
}

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

public Slide getSlide() {
    if( id != 0 ){
        startTransaction();
        slide = entityManager.find(Slide.class, id);
        endTransaction();
        closeTransaction();
    }

    return slide;
}

public void setSlide(Slide slide) {
    this.slide = slide;
}

public UploadedFile getUploadedFile() {
    return uploadedFile;
}

public void setUploadedFile(UploadedFile uploadedFile) {
    this.uploadedFile = uploadedFile;
}

@SuppressWarnings("unchecked")
public List<Slide> getSlides() {
    startTransaction();
    slides = entityManager.createQuery("from Slide").getResultList();
    System.out.println(">>>>>>>>>>>>>>>>>>SLIDES");
    endTransaction();
    closeTransaction();

    return slides;
}

public void setSlides(List<Slide> slides) {
    this.slides = slides;
}

public Integer[] getCoordinates() {
    return coordinates;
}

public void setCoordinates(Integer[] coordinates) {
    this.coordinates = coordinates;
}

public Image getImage() {
    return image;
}

public void setImage(Image image) {
    this.image = image;
}

public boolean isExternalLink() {
    return externalLink;
}

public void setExternalLink(boolean externalLink) {
    this.externalLink = externalLink;
}

@SuppressWarnings("unchecked")
public List<Slide> getPublicSlides() {
    startTransaction();
    publicSlides = entityManager.createQuery("from Slide where showOnFeed = true").getResultList();
    return publicSlides;
}

public void setPublicSlides(List<Slide> publicSlides) {
    this.publicSlides = publicSlides;
}

public boolean isEditable() {
    return editable;
}

public void setEditable(boolean editable) {
    this.editable = editable;
}

public int getPageId() {
    return pageId;
}

public void setPageId(int pageId) {
    this.pageId = pageId;
}
}
@Named
@请求范围
公共类幻灯片操作{
私有EntityManagerFactory EntityManagerFactory=Persistence.createEntityManagerFactory(“db”);
私人实体管理者实体管理者;
私有int-id;
私有int-pageId;
私有整数坐标[]=新整数[4];
私有图像;
私人幻灯片=新幻灯片();
私有列表幻灯片=新建ArrayList();
private List publicsslides=new ArrayList();
私有上传文件上传文件;
私有布尔外部链接=false;
私有布尔可编辑=真;
公共字符串add(){
返回“添加”;
}
公共字符串addSlide(){
ImageAction ImageAction=新建ImageAction();
上传(uploadedFile,false);
image=imageAction.getImage();
幻灯片。设置图像(图像);
幻灯片。设置裁剪(假);
startTransaction();
如果(!外部链接){
slide.setPage(entityManager.find(Page.class,pageId));
}
entityManager.persist(图像);
entityManager.persist(幻灯片);
endTransaction();
closeTransaction();
setId(slide.getId());
返回“详细信息”;
}
公共幻灯片(){
系统输出打印项次(幻灯片);
startTransaction();
entityManager.merge(幻灯片);
endTransaction();
closeTransaction();
}   
公共幻灯片(){
startTransaction();
slide=(slide)entityManager.find(slide.class,id);
实体管理器。移除(滑动);
endTransaction();
closeTransaction();
幻灯片。移除(幻灯片);
ImageAction imageAtion=新ImageAction();
delete(slide.getImage().getUniqueName(),slide.getImage().getHumb());
}
公共void makeEditable(){
可编辑=真;
}
公共无效开始交易(){
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
}
公开作废endTransaction(){
entityManager.getTransaction().commit();
}
公共事务(){
entityManager.close();
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共幻灯片getSlide(){
如果(id!=0){
startTransaction();
slide=entityManager.find(slide.class,id);
endTransaction();
closeTransaction();
}
回程滑道;
}
公共空间设置滑梯(滑梯){
this.slide=幻灯片;
}
public UploadedFile getUploadedFile(){
返回上传的文件;
}
public void setUploadedFile(UploadedFile UploadedFile){
this.uploadedFile=uploadedFile;
}
@抑制警告(“未选中”)
公共列表getSlides(){
startTransaction();
slides=entityManager.createQuery(“来自幻灯片”).getResultList();
System.out.println(“>>>>>>>>>>>>>>幻灯片”);
endTransaction();
closeTransaction();
返回幻灯片;
}
公共幻灯片(列表幻灯片){
this.slides=幻灯片;
}
公共整数[]getCoordinates(){
返回坐标;
}
公共void集合坐标(整数[]坐标){
这个。坐标=坐标;
}
公共映像getImage(){
返回图像;
}
公共void setImage(图像){
这个图像=图像;
}
公共布尔值IsExternalink(){
返回外部墨水;
}
公共void setExternalLink(布尔值externalLink){
this.externalLink=externalLink;
}
@抑制警告(“未选中”)
公共列表getPublicSlides(){
startTransaction();
publicSlides=entityManager.createQuery(“来自showOnFeed=true的幻灯片”).getResultList();
返回幻灯片;
}
public void setPublicSlides(列出publicSlides){
this.publicsslides=publicsslides;
}
公共布尔值可编辑(){
返回可编辑;
}
公共void setEditable(布尔可编辑){
this.editable=可编辑;
}
public int getPageId(){
返回pageId;
}
公共无效setPageId(int-pageId){
this.pageId=pageId;
}
}
编辑页面:

<html>
<!-- DOCTYPE specification -->
    <f:metadata>
        <f:viewParam name="id" value="#{sliderAction.id}"/>
    </f:metadata>

<ui:composition template="/view/private/administration/administrator.xhtml">

<ui:define name="title">#{msgs.addingSlide}</ui:define>

<ui:define name="extra-head">
    <h:outputStylesheet library="css" name="jquery.jcrop.min.css"/>     
</ui:define>

<ui:define name="content">

    <div class="grid_14">

        <h4 class="page-heading"><h:outputText value="#{sliderAction.slide.title} #{msgs.details}" /></h4>

        <div class="line clear"></div>

        <h:panelGroup id="details">

            <h:form id="edit-slide">
                <h:panelGrid columns="2">

                    <h:outputText value="#{msgs.slideTitle}" styleClass="label"/>
                    <h:outputText value="#{sliderAction.slide.title}" rendered="#{not sliderAction.editable}"/>
                    <h:inputText id="title" value="#{sliderAction.slide.title}" required="true" rendered="#{sliderAction.editable}"/>
                    <p></p><h:message for="title" errorClass="error"/>

                    <h:outputText value="#{msgs.description}" styleClass="label"/>
                    <h:outputText value="#{sliderAction.edidSlide.description}" rendered="#{not sliderAction.editable}"/>
                    <h:inputTextarea id="description" value="#{sliderAction.slide.description}" required="true" rendered="#{sliderAction.editable}"/>                                                               
                    <p></p><h:message for="description" errorClass="error"/>

                    <h:outputText value="#{msgs.page}" styleClass="label" />
                    <h:link outcome="notset" rendered="#{not sliderAction.editable}">
                        <h:outputText value="#{sliderAction.slide.page.heading}"/>
                        <f:param name="id" value="#{sliderAction.slide.page.id}" />
                    </h:link>
                    <h:selectOneMenu id="page" value="#{sliderAction.pageId}" required="true" rendered="#{sliderAction.editable}">
                        <f:selectItems value="#{pageAction.pages}" var="page" itemLabel="#{page.heading}" itemValue="#{page.id}"/>
                    </h:selectOneMenu>                  
                    <p></p><h:message for="page" errorClass="error"/>               

                    <p></p>
                    <h:commandButton action="#{sliderAction.makeEditable}" value="#{msgs.edit}" styleClass="button" rendered="#{not sliderAction.editable}">
                        <f:ajax render="@form" execute="@this" />
                    </h:commandButton>
                    <h:commandButton action="#{sliderAction.editSlide}" value="#{msgs.saveChanges}" styleClass="button" rendered="#{sliderAction.editable}">
                        <f:ajax render="@form" execute="@form" />
                    </h:commandButton>

                    <h:message for="edit-slide"/>

                </h:panelGrid>
            </h:form>

        </h:panelGroup>

    </div>

</ui:define>

#{msgs.addingSlide}
public String getSlide() {
    if(slide == null)
        slide = getFromDB();

    return slide;
}