Я написал форму в премьер-фейсах, где я хочу показать и изменить свои данные в моей базе данных. Теперь я хочу сделать так, чтобы пользователь мог изменить данные во внешнем интерфейсе и отменить его, если он перезагрузит страницу. На этой странице должна быть кнопка сохранения, и только если эта кнопка была нажата, данные должны быть сохранены в базе данных.

В настоящее время у меня возникла проблема: если я запустил метод onSave, я не смогу увидеть переменные моей предыдущей функции onEdit. Поэтому я записал в базу только неправильные данные.

EditObject.java:

@ManagedBean
public class EditObjects implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<Objects> myObjects;
    private Source[] mySources;

    public EditObjects() {
        ObjectsDAO odao = new ObjectsDAO();
        myObjects = odao.getAllObjects();
        SourceDAO sdao = new SourceDAO();
        mySources = sdao.getSourceList();
    }

    public Source[] getSourceList() {
        return mySources;
    }

    public List<Objects> getMyObjects() {
        return myObjects;
    }

    public void setMyObjects(List<Objects> myObjects) {
        this.myObjects = myObjects;
    }

    public Source[] getMySources() {
        return mySources;
    }

    public void setMySources(Source[] mySources) {
        this.mySources = mySources;
    }

    public void save() {
        ObjectsDAO odao = new ObjectsDAO();
        odao.save(myObjects);
    }
}

TabDefineObjects.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head></h:head>
<body>
    <h:form id="form">

        <ui:param name="myeditobjects" value="#{editObjects}" />
        <p:dataTable var="object" value="#{myeditobjects.myObjects}" id="objectList" editable="true">

            <f:facet name="header">
                In-Cell Editing
            </f:facet>

            <p:column headerText="Name" style="width:30%">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{object.o_name}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{object.o_name}" style="width:100%"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Source" style="width:24%">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{object.sourceName}" />
                    </f:facet>
                    <f:facet name="input">
                        <h:selectOneMenu value="#{object.sourceName}" >
                            <f:selectItems value="#{myeditobjects.mySources}"
                                var="sources"
                                itemLabel="#{sources.s_name}"
                                itemValue="#{sources.s_name}" />
                        </h:selectOneMenu>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Description" style="width:20%">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{object.o_desc}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{object.o_desc}" style="width:100%" label="o_desc"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column style="width:6%">
                <p:rowEditor />
            </p:column>
        </p:dataTable>
        <p:commandButton value="Submit" actionListener="#{myeditobjects.save()}" id="btnSubmit"/>    
    </h:form>
    </body>
</html>

Objects.java:

@Entity
@Table (name = "objects", schema="genmeta")
public class Objects {
    @Id
    @Column(unique=true, nullable=false)
    private int o_id;
    private String o_name;
    @ManyToOne
    @JoinColumn(name="s_id")
    private Source source;
    private String o_desc;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "object_tg_assc", joinColumns = { @JoinColumn(name = "o_id") }, inverseJoinColumns = { @JoinColumn(name = "tg_id") })
    private Set<TemplateGroup> templateGroups;
    @OneToMany(mappedBy="objects")
    private Set<ObjectTGAssc> objectTGAsscs;
    @OneToMany(mappedBy="object")
    private Set<ObjectAttribute> objectAttribute;
    @Transient
    private boolean newEntry = false;

    /**
     * Getters and Setters 
     */
    public int getO_id() {
        return o_id;
    }
    public void setO_id(int o_id) {
        this.o_id = o_id;
    }
    public String getO_name() {
        return o_name;
    }
    public void setO_name(String o_name) {
        this.o_name = o_name;
    }
    public String getSourceName() {
        return source.getS_name();
    }
    public void setSourceName(String name) {
        SourceDAO sdao = new SourceDAO();
        Source[] sources = sdao.getSourceList();
        for(Source source : sources) {
            if (source.getS_name().equals(name)) {
                this.source = source;
            }
        }
    }
    public String getO_desc() {
        return o_desc;
    }
    public void setO_desc(String o_desc) {
        this.o_desc = o_desc;
    }
    public Set<TemplateGroup> getTemplateGroups() {
        return templateGroups;
    }
    public void setTemplateGroups(Set<TemplateGroup> templateGroups) {
        this.templateGroups = templateGroups;
    }
    public Set<ObjectTGAssc> getObjectTGAsscs() {
        return objectTGAsscs;
    }
    public void setObjectTGAsscs(Set<ObjectTGAssc> objectTGAsscs) {
        this.objectTGAsscs = objectTGAsscs;
    }
    public Set<ObjectAttribute> getObjectAttribute() {
        return objectAttribute;
    }
    public void setObjectAttribute(Set<ObjectAttribute> objectAttribute) {
        this.objectAttribute = objectAttribute;
    }
    public boolean isNewEntry() {
        return newEntry;
    }
    public void setNewEntry(boolean newEntry) {
        this.newEntry = newEntry;
    }
}

ObjectsDAO.java:

public class ObjectsDAO {
    private static SessionFactory factory;

    public ObjectsDAO() {
        factory = Database.getSession();
    }

    /**
     * Gibt den gesuchten Attributtypen zurück
     * @param id Die zu suchende Id
     * @return Die gesuchte Spalte identifiziert anhand der ID
     */
    @SuppressWarnings("unchecked")
    public List<Objects> getAllObjects() {
        Session session = factory.openSession();
        List<Objects> myObjects = null;
        Query query = session.createQuery("from Objects");
        myObjects = query.list();
        session.close();
        return myObjects;
    }

    public void save(List<Objects> allObjects) {
        Session session = factory.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            for(Objects curObject : allObjects) {
                if (curObject.isNewEntry()) {
                    session.save(curObject);
                } else {
                    session.update(curObject);
                }
            }
            tx.commit();
        } catch(HibernateException e) {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

Sources.java:

@Entity
@Table (name = "source", schema="genmeta")
public class Source {
    @Id
    @Column(unique=true, nullable=false)
    private int s_id;
    private String s_name;
    @ManyToOne
    @JoinColumn(name="w_id")
    private Workspace workspace;
    private String s_desc;
    @OneToMany(mappedBy="source")
    private Set<Objects> objects;

    /**
     * Getters and Setters 
     */
    public int getS_id() {
        return s_id;
    }
    public void setS_id(int s_id) {
        this.s_id = s_id;
    }
    public String getS_name() {
        return s_name;
    }
    public void setS_name(String s_name) {
        this.s_name = s_name;
    }
    public Workspace getWorkspace() {
        return workspace;
    }
    public void setWorkspace(Workspace workspace) {
        this.workspace = workspace;
    }
    public String getS_desc() {
        return s_desc;
    }
    public void setS_desc(String s_desc) {
        this.s_desc = s_desc;
    }
    public Set<Objects> getObjects() {
        return objects;
    }
    public void setObjects(Set<Objects> objects) {
        this.objects = objects;
    }
}

Источники DAO.java:

public class SourceDAO {
    private static SessionFactory factory;

    public SourceDAO() {
        factory = Database.getSession();
    }

    @SuppressWarnings("unchecked")
    public Source[] getSourceList() {
        Session session = factory.openSession();
        List<Source> mySources = null;
        Query query = session.createQuery("from Source");
        mySources = query.list();
        session.close();
        return mySources.toArray(new Source[0]);
    }
}

Hibernate.cfg.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost/postgres</property>
        <property name="hibernate.connection.username">***</property>
        <property name="connection.password">***</property>
        <property name="connection.pool_size">1</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">validate</property>

        <mapping class="db.hibernate.classes.Attributetype"/>
        <mapping class="db.hibernate.classes.Datatype"/>
        <mapping class="db.hibernate.classes.ObjectAttribute"/>
        <mapping class="db.hibernate.classes.Objects"/>
        <mapping class="db.hibernate.classes.ObjectSpecification"/>
        <mapping class="db.hibernate.classes.ObjectSpecificationType"/>
        <mapping class="db.hibernate.classes.ObjectTGAssc"/>
        <mapping class="db.hibernate.classes.Source"/>
        <mapping class="db.hibernate.classes.Template"/>
        <mapping class="db.hibernate.classes.TemplateTGAssc"/>
        <mapping class="db.hibernate.classes.TemplateGroup"/>
        <mapping class="db.hibernate.classes.TemplateType"/>
        <mapping class="db.hibernate.classes.Users"/>
        <mapping class="db.hibernate.classes.Workspace"/>
        <mapping class="db.hibernate.classes.WorkspaceUserAssc"/>
    </session-factory>
</hibernate-configuration>

Большое спасибо за внимание.

С уважением, Бьёрн

0
Björn 18 Май 2014 в 15:44

2 ответа

Лучший ответ

Вы не указали область для вашего bean-компонента, по умолчанию это будет @RequestScoped. Для поддержки запросов, сделанных к текущему представлению, и сохранения текущего состояния представления между запросами, вы должны пометить свой компонент как минимум @ViewScoped.

@ManagedBean
@ViewScoped
public class EditObjects implements Serializable {
}

Больше информации:

1
Community 23 Май 2017 в 12:05

Вам не нужно добавлять здесь метод onEdit.

Любые изменения, внесенные вами в datatable, обновят объект в управляемом компоненте.

Удалите строку из вашего xhtml

        <p:ajax event="rowEdit" listener="#{myeditobjects.onEdit}" />

И удалите указанный выше метод из управляемого bean-компонента.

Теперь, если внести какие-либо изменения в таблицу данных и вызвать сохранение, вы увидите, что объекты обновлены.

Надеюсь, это поможет.

1
Makky 18 Май 2014 в 14:25