1

私は現在、java+hibernate+oracle を使用して販売モジュールに取り組んでいます... 次のように jsp で注文フォームを作成しました。

これを行うパラメーターを取得しています:

ArrayList<String> idMercaderias = new ArrayList<String>();
ArrayList<String> cantidades = new ArrayList<String>();
ArrayList<String> precios = new ArrayList<String>();
for (int k = 0; k < 10; k++) {
  idMercaderias.add(request.getParameter("idMercaderia" + k));
  cantidades.add(request.getParameter("cantidad" + k));
  precios.add(request.getParameter("precio" + k));
}

注文の詳細に 10 行あるので、入力が input1、input2、input3 などの for を作成しました。これらはオブジェクト Mercaderia の属性なので、リストにあるため、設定する必要があります。

最初に、記事が繰り返されないように最初のリストをフィルタリングしています。

Iterator itra = idMercaderias.listIterator();
ArrayList<String> sortedListIdMercaderias = new ArrayList<String>();
Object m;
while (itra.hasNext()) {
m = itra.next();
  if (!sortedListIdMercaderias.contains(m)) {
  sortedListIdMercaderias.add((String) m);
  }
}

ここで、すべての属性を設定するオブジェクトを作成します。

DetallePedido detalle = new DetallePedido();

今、私はサイクルを 10 回実行しており (フォーム内のすべての行を考慮して)、各リストの反復を開始して、null または空のエントリを回避するオブジェクト属性を取得しています。

for (int x = 0; x < sortedListIdMercaderias.size(); x++) {
Iterator itr = idMercaderias.listIterator();
while (itr.hasNext()) {
  String mercaderia = (String) itr.next();
  if ((mercaderia != null) && (!mercaderia.equals(""))) {
    Mercaderia mercaderiaSeleccionada = new MercaderiaDAO().findById(Integer.parseInt(mercaderia));
    detalle.setMercaderia(mercaderiaSeleccionada);
    }
}

Iterator itr2 = cantidades.listIterator();
while (itr2.hasNext()) {
  String cantidad = (String) itr2.next();
  if ((cantidad != null) && (!cantidad.equals(""))) {
    int cantidadMercaderiaSeleccionada = Integer.parseInt(cantidad);
    detalle.setCantidad(cantidadMercaderiaSeleccionada);
    }
}

Iterator itr3 = precios.listIterator();
while (itr3.hasNext()) {
  String precio = (String) itr3.next();
  if ((precio != null) && (!precio.equals(""))) {
    BigDecimal precioMercaderiaSeleccionada = new BigDecimal(precio);
    detalle.setPrecioUnitario(precioMercaderiaSeleccionada);                    
    }
}

最後に、データベースに永続化します:

Session session = new DetallePedidoDAO().getSession();
Transaction tx = session.beginTransaction();
try {
  session.saveOrUpdate(detalle);
  tx.commit();
session.close();
} catch (HibernateException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
}

データベースで、すべての行ではなく、1 行 (有効なデータを持つ最後の行) のみが挿入される理由がわかりません。

これは、大学のプロジェクトでの最終テストのためのものです。

4

2 に答える 2

2

DetallePedidoオブジェクトは 1 つしかありません。さまざまなループでフィールド値を何度も変更していますが、それでもオブジェクトは 1 つにすぎません。最後に、あなたはそれを保存しています。一度だけ。当然、データベースには 1 行しか挿入されません。

あなたが試すことができるのは、Mercaderiaオブジェクト、Cantidadオブジェクト、Precioオブジェクトを別々に繰り返すのではなく、WITHIN EACH ITERATION が新しいDetallePedidoオブジェクトを作成しMercaderia、 、 、Cantidadaおよび を設定し、Precioを保存する単一のループがありDetallePedidoます。

于 2013-10-21T22:39:19.933 に答える
1

そこで、David WallaceWrapperDetallePedidoの手がかりに従って、アイデアに微調整を加え、次のようなオブジェクトを作成しました。

public class WrapperDetallePedido {

    int idMercaderia;
    int cantidad;
    double precio;

    public int getIdMercaderia() {
        return idMercaderia;
    }
    public void setIdMercaderia(int idMercaderia) {
        this.idMercaderia = idMercaderia;
    }
    public int getCantidad() {
        return cantidad;
    }
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }
    public double getPrecio() {
        return precio;
    }
    public void setPrecio(double precio) {
        this.precio = precio;
    }

}

次に、コントローラーで単一のものを作成し、属性ArrayListを設定しました。DetallePedido

ArrayList<WrapperDetallePedido> listado = new ArrayList<WrapperDetallePedido>();
for (int k = 0; k < 10; k++) {
        if (!request.getParameter("idMercaderia" + k).equals("")){
            WrapperDetallePedido WDetallePedido = new WrapperDetallePedido();
            WDetallePedido.setIdMercaderia(Integer.parseInt(request.getParameter("idMercaderia" + k)));
            WDetallePedido.setCantidad(Integer.parseInt(request.getParameter("cantidad" + k)));
            WDetallePedido.setPrecio(Double.parseDouble(request.getParameter("precio" + k)));
            listado.add(WDetallePedido);
        }                   
    }

最後Iteratorに前のリストに使用され、listado からすべての項目を設定し、データベースに永続化します。

for (Iterator iterador = listado.listIterator(); iterador.hasNext();) {
    WrapperDetallePedido detalle = (WrapperDetallePedido) iterador.next();
    Mercaderia mercaderiaSeleccionada = new MercaderiaDAO().findById(detalle.getIdMercaderia());
    DetallePedido detallePedido = new DetallePedido();
    detallePedido.setMercaderia(mercaderiaSeleccionada);
    detallePedido.setCantidad(detalle.getCantidad());
    detallePedido.setPrecioUnitario(new BigDecimal(detalle.getPrecio()));
    detallePedido.setPedidos(pedidoGenerado);
    Session session1 = new DetallePedidoDAO().getSession();
    Transaction tx1 = session1.beginTransaction();
    new DetallePedidoDAO().save(detallePedido);
    try {
        session1.saveOrUpdate(detallePedido);
        tx1.commit();
        session1.close();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

最後に、必要に応じてすべての行を挿入しました...ありがとう!

于 2013-10-22T06:33:52.140 に答える