0

おそらく初心者のJava...のものですが、ここにあります。JPA を使用して INSERT ストアド プロシージャを Oracle 11g データベースに呼び出します。DBテーブルにデータを取得するという点では、すべて正常に機能します。

JPA コードを Java Swing アプリケーションにラップしました。私の問題は、データが何らかの形で 2 回送信されることです。JOptionPane.showMessageDialogデータを送信すると表示される があります。それは一度だけ表示されます。しかし、テーブルにクエリを実行すると、テーブルに 2 つのエントリがあります。これが私のコードです....

ボタンコード

JButton btnSubmit = new JButton("Submit");
btnSubmit.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        AddNewCustomer();
    }
});
btnSubmit.setBounds(24, 341, 91, 23);
frmNewCustomer.getContentPane().add(btnSubmit);

アクション メソッド

public void AddNewCustomer() {
    Customer.AddCustomer(this.txtFirstName.getText(),
            this.txtLastName.getText(), this.txtAddress.getText(),
            this.txtCity.getText(), this.txtState.getText(),
            this.txtEmail.getText(), this.txtPhone.getText());

    JOptionPane.showMessageDialog(frmNewCustomer, "Added new customer",
            "Status", 1);
}

protected static void AddCustomer(String sFirstName, String sLastName,
        String sAddress, String sCity, String sState, String sEmail,
        String sPhone) {
    try {
        factory = Persistence
                .createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();

        Query q = em.createNamedQuery("AddCustomer");
        q.setParameter("p_PHONE", sPhone);
        q.setParameter("p_STATE", sState);
        q.setParameter("p_FIRST_NAME", sFirstName);
        q.setParameter("p_ADDRESS", sAddress);
        q.setParameter("p_EMAIL", sEmail);
        q.setParameter("p_CITY", sCity);
        q.setParameter("p_LAST_NAME", sLastName);
        int r = q.executeUpdate();
        em.getTransaction().commit();

        List results = q.getResultList();
        if (results != null) {
            Object id = results.get(0);
            if (id != null) {
                System.out.println(id.toString());
            }
        }
        em.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4

2 に答える 2

0

への呼び出しを削除する必要がありますgetResultList()。これは同じクエリを再度実行しています (選択クエリではなく挿入クエリです)。いずれにせよ、ID を取得するためにそれは必要ないはずです。この質問を参照してください。これにはまったくクエリを使用する必要はありませんが、エントリを作成する適切な方法は使用する必要があるためentityManager.persist(obj)です (JPA エンティティがあると仮定すると、とにかく JPA を使用しているため、これを使用する必要があります)。

于 2012-07-12T09:50:34.230 に答える
0

この問題を解決しました。コードを...に変更しました。

protected static void AddCustomer(String sFirstName,String sLastName, String sAddress, String sCity, String sState,String sEmail,String sPhone )
{

    try {
        factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();

        Query q = em.createNamedQuery("AddCustomer");   
        q.setParameter("p_PHONE", sPhone);
        q.setParameter("p_STATE", sState);
        q.setParameter("p_FIRST_NAME", sFirstName);
        q.setParameter("p_ADDRESS", sAddress);
        q.setParameter("p_EMAIL", sEmail);
        q.setParameter("p_CITY", sCity);
        q.setParameter("p_LAST_NAME", sLastName);
        //int r = q.executeUpdate();                
        //em.getTransaction().commit();

        List results = q.getResultList();
        if(results != null)
        {           
            Object id = results.get(0);
            if(id != null)
            {
                System.out.println(id.toString());
            }
            em.getTransaction().commit();
        }
        em.close(); 
    } catch (Exception e) {

        e.printStackTrace();
    }

}
于 2012-07-13T07:35:37.830 に答える