1

変更可能な入力ボックスのテキストとして画面に表示されるエンティティがあります。保存を押してフォームを送信すると、ejb3 コンポーネントでデータを処理し、エンティティ マネージャーを使用して永続化またはマージしたいと考えています。しかし、何らかの理由で、データを変更して保存すると、ejb3 をバイパスしてデータベースでデータが直接更新されます。これは確かに望ましくありません。私のコードは次のようになります

@Entity
@Table(name = "EMP")
public class Emp implements java.io.Serializable {

private short empno;
private Dept dept;
private String ename;
private String job;
private Short mgr;
private Date hiredate;
private BigDecimal sal;
private BigDecimal comm;

public Emp() {
}

public Emp(short empno) {
    this.empno = empno;
}
public Emp(short empno, Dept dept, String ename, String job, Short mgr,
        Date hiredate, BigDecimal sal, BigDecimal comm) {
    this.empno = empno;
    this.dept = dept;
    this.ename = ename;
    this.job = job;
    this.mgr = mgr;
    this.hiredate = hiredate;
    this.sal = sal;
    this.comm = comm;
}

@Id
@Column(name = "EMPNO", unique = true, nullable = false, precision = 4, scale = 0)
public short getEmpno() {
    return this.empno;
}

public void setEmpno(short empno) {
    this.empno = empno;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEPTNO")
public Dept getDept() {
    return this.dept;
}

public void setDept(Dept dept) {
    this.dept = dept;
}

@Column(name = "ENAME", length = 10)
@Length(max = 10)
public String getEname() {
    return this.ename;
}

public void setEname(String ename) {
    this.ename = ename;
}

@Column(name = "JOB", length = 9)
@Length(max = 9)
public String getJob() {
    return this.job;
}

public void setJob(String job) {
    this.job = job;
}

@Column(name = "MGR", precision = 4, scale = 0)
public Short getMgr() {
    return this.mgr;
}

public void setMgr(Short mgr) {
    this.mgr = mgr;
}

@Temporal(TemporalType.DATE)
@Column(name = "HIREDATE", length = 7)
public Date getHiredate() {
    return this.hiredate;
}

public void setHiredate(Date hiredate) {
    this.hiredate = hiredate;
}

@Column(name = "SAL", precision = 7)
public BigDecimal getSal() {
    return this.sal;
}

public void setSal(BigDecimal sal) {
    this.sal = sal;
}

@Column(name = "COMM", precision = 7)
public BigDecimal getComm() {
    return this.comm;
}

public void setComm(BigDecimal comm) {
    this.comm = comm;
}

}

    @Stateful
    @Name("workflow")
    @Scope(ScopeType.CONVERSATION)
    public class WorkflowBean implements Workflow
    {
    @Logger private Log log;

    @In StatusMessages statusMessages;


    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    EntityManager entityManager;


    @Out(required=false)
    Emp employee = new Emp();

    @RequestParameter("empEmpno")
    String empNo;


    public void workflow()
    {

        log.info("workflow.workflow() action called");
        statusMessages.add("workflow");

    } 
    @End
    public boolean save(){
       entityManager.merge(emp);
       entityManger.flush();
    }
    @Begin(join=true)
    public boolean populateEmp(){
        entityManager.setFlushMode(FlushModeType.COMMIT);
        System.out.println("The Emp No. is---"+empNo);
        int no = Integer.parseInt(empNo);
        short emp =(short)no;
        employee = entityManager.find(Emp.class, emp);
        entityManager.flush();
        return true;
    }
    public Emp getEmployee() {
        return employee;
    }

    public void setEmployee(Emp employee) {
        this.employee = employee;
    }
    // add additional action methods

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }
    @Remove
    @Destroy
    public void destroy() {

    }
}

私のビューは次のようになります

<h:form id="emp" styleClass="edit">

        <rich:panel>
            <f:facet name="header">Edit Emp</f:facet>

            <s:decorate id="empnoField" template="layout/edit.xhtml">
                <ui:define name="label">Empno</ui:define>
                <h:inputText id="empno"
                       required="true"
                          value="#{workflow.employee.empno}">
                </h:inputText>
            </s:decorate>


            <s:decorate id="commField" template="layout/edit.xhtml">
                <ui:define name="label">Comm</ui:define>
                <h:inputText id="comm"
                          value="#{workflow.employee.comm}"
                           size="14">
                </h:inputText>
            </s:decorate>



            <s:decorate id="enameField" template="layout/edit.xhtml">
                <ui:define name="label">Ename</ui:define>
                <h:inputText id="ename"
                           size="10"
                      maxlength="10"
                          value="#{workflow.employee.ename}">
                </h:inputText>
            </s:decorate>


            <s:decorate id="hiredateField" template="layout/edit.xhtml">
                <ui:define name="label">Hiredate</ui:define>
                <rich:calendar id="hiredate"
                          value="#{workflow.employee.hiredate}" datePattern="MM/dd/yyyy" />
            </s:decorate>


            <s:decorate id="jobField" template="layout/edit.xhtml">
                <ui:define name="label">Job</ui:define>
                <h:inputText id="job"
                           size="9"
                      maxlength="9"
                          value="#{workflow.employee.job}">
                </h:inputText>
            </s:decorate>


            <s:decorate id="mgrField" template="layout/edit.xhtml">
                <ui:define name="label">Mgr</ui:define>
                <h:inputText id="mgr"
                          value="#{workflow.employee.mgr}">
                </h:inputText>
            </s:decorate>


            <s:decorate id="salField" template="layout/edit.xhtml">
                <ui:define name="label">Sal</ui:define>
                <h:inputText id="sal"
                          value="#{workflow.employee.sal}"
                           size="14">
                </h:inputText>
            </s:decorate>
            <s:decorate id="deptField" template="layout/edit.xhtml">
                <ui:define name="label">Department</ui:define>
                <h:inputText id="dname"
                          value="#{workflow.deptName}">
                </h:inputText>
            </s:decorate>
            <div style="clear:both">
                <span class="required">*</span>
                required fields
            </div>

        </rich:panel>

        <div class="actionButtons">

            <h:commandButton id="save"
                          value="Save"
                         action="#{workflow.save}"
                       rendered="true"/>
        </div>
    </h:form>
4

1 に答える 1

0

[あなたの回答に対するコメントで問題に対処することは困難でした。]

私が理解していないことがいくつかあり、なぜそれがそのように行われたのか。

  • 一時フィールドを使用すると、永続化中にエンティティオブジェクトにそれらを追加するオーバーヘッドが追加されます。
  • 自動コミットが問題を引き起こし、実装できないのはなぜですか。

これらに関係なく、あなたは試すことができます

  • エンティティをデタッチするentityManager.detach(entity)か、永続コンテキストをクリアしてentityManager.clear()、基になるすべてのエンティティをデタッチします。しかし、前のものがより有利です。
  • コンテナの代わりに手動でトランザクションを管理できます。操作を制御できるBMTを使用します。
于 2013-02-13T05:22:45.490 に答える