1

Swing と Hibernate 機能を使用するアプリケーションを作成しましたが、先生から Socket を使用してクライアント/サーバー通信を行う必要があると言われました (大学の宿題です)。たとえば、アプリケーションはさまざまなテーブルに対して挿入/更新/削除を行っており、ユーザーがデータを書き込み、挿入/更新/削除ボタンを押した後にデータベースに変更が加えられている JFrame があります。しかし、ソケットを使用するようにこのプログラムを変更する方法が本当にわかりません。クライアントには、サーバー上のメソッドを呼び出し、データベースに変更を加えてから結果をクライアントに返すアクションが実行されるボタンが必要ですか? または、このプログラムで Socket をどのように使用すればよいですか?

誰かが私にいくつかのアイデアを手伝ってくれるかもしれません。前もって感謝します!

Swing と Hibernate を使用しているコードは次のとおりです。

public class AdaugaProdus extends javax.swing.JFrame {
private final Session session;

public AdaugaProdus() {
    session = HibernateUtil.getSessionFactory().openSession();
    initComponents();
    initComboBoxes();
}                       

private void initComboBoxes() {
    IdFurnComboBox.removeAllItems();
    IdCatComboBox.removeAllItems();
    IdRaftComboBox.removeAllItems();

    List<Furnizor> furnizori = session.createQuery("from Furnizor").list();
    for (Furnizor furnizor : furnizori)
        IdFurnComboBox.addItem(furnizor);

    List<Categorie> categorii = session.createQuery("from Categorie").list();
    for (Categorie categorie : categorii)
        IdCatComboBox.addItem(categorie);

    List<Istoricprod> rafturi = session.createQuery("from Istoricprod").list();
    for (Istoricprod raft : rafturi)
        IdRaftComboBox.addItem(raft);

}

private void InsereazaButtonActionPerformed(java.awt.event.ActionEvent evt)    {                                                
    runQueryBasedOnInsert();
}                                               

private void runQueryBasedOnInsert(){

try{
    org.hibernate.Transaction tx = session.beginTransaction();

    Produs produs = new Produs();

    int idFurn = ((Furnizor)IdFurnComboBox.getSelectedItem()).getIdfurn();
    Furnizor furnizor = new Furnizor(idFurn);
    produs.setFurnizor(furnizor);

    int idCat = ((Categorie)IdCatComboBox.getSelectedItem()).getIdcat();
    Categorie categorie = new Categorie(idCat);
    produs.setCategorie(categorie);

    int idRaft = ((Istoricprod)IdRaftComboBox.getSelectedItem()).getIdraft();
    Istoricprod istoricprod = new Istoricprod(idRaft);
    produs.setIstoricprod(istoricprod);

    produs.setDenumire(DenumireTextField.getText());
    produs.setCantitate(Integer.parseInt(CantitateTextField.getText()));
    produs.setUnitmas(UnitMasTextField.getText());

    session.save(produs);

    tx.commit();
  }
  catch(Exception e){
  System.out.println(e.getMessage());
  } 
   /*finally{
   session.close();
   }*/
   }

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new AdaugaProdus().setVisible(true);
        }
    });
}
4

1 に答える 1

2

クライアントには、サーバー上のメソッドを呼び出し、データベースに変更を加えてから結果をクライアントに返すアクションが実行されるボタンが必要ですか?

はい。ただし、メソッドを直接呼び出すことはありません (RMI を使用することは想定されていません)。先生は、複数のクライアントが (odbc などではなく) Java ソケットを介してデータベースで作業できるようにするプログラムを作成することを望んでいます。

Java でクライアント サーバー プログラムを作成したことがない場合は、次のチュートリアルをお読みください。

http://download.oracle.com/javase/tutorial/networking/sockets/

残念ながら、これにはコードへの多くの変更が含まれます。たとえばorg.hibernate.Transaction tx = session.beginTransaction();、サーバー上にあるIdFurnComboBox.getSelectedItem()必要があり、クライアント上にある必要があります。経験則として、DB にアクセスするすべてのものをサーバー プログラムに配置し、ユーザー (UI) と連携するすべてのものをクライアントに配置できます。

サーバーには、クライアントが接続するリッスン ソケットが必要です。クライアントはサーバーにコマンドを送信します。GUI で選択されたアイテムは、サーバーが DB を更新します。

于 2012-06-04T07:03:19.737 に答える