1

これについて助けが必要です。コードがより明確になると、これは永続化する私の機能です:

public String finalizarCompra() {
  Pedido pedido = new Pedido();
  pedido.setEstado("almacen");
  pedido.setFechaVenta(new Date());
  pedido.setIdUsuario(loginBean.getUsuario());
  Producto p;
  Integer i;
  DetPedido detPedido;
  List<DetPedido> lista = new ArrayList<>();
  for (Map.Entry e : productos.entrySet()) {
    detPedido = new DetPedido();
    p = (Producto) e.getKey();
    i = (Integer) e.getValue();
    detPedido.setProducto(p);
    detPedido.setCantidad(i);
    detPedido.setPrecioUnidad(p.getPrecioUnidad());
    detPedido.setPedido(pedido);
    lista.add(detPedido);
    detPedidoBean.insert(detPedido);
  }
  pedido.setDetPedidoCollection(lista);
  pedidoBean.insert(pedido);
  return "";
}

これは私の Pedido エンティティです:

@Entity
public class Pedido implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "ID_PEDIDO")
  private Integer idPedido;

  @Basic(optional = false)
  @NotNull
  @Column(name = "FECHA_VENTA")
  @Temporal(TemporalType.TIMESTAMP)
  private Date fechaVenta;

  @Column(name = "FECHA_ENVIO")
  @Temporal(TemporalType.TIMESTAMP)
  private Date fechaEnvio;

  @Basic(optional = false)
  @NotNull
  @Size(min = 1, max = 50)
  @Column(name = "ESTADO")
  private String estado;

  @JoinColumn(name = "ID_USUARIO", referencedColumnName = "ID_USUARIO")
  @ManyToOne(optional = false)
  private Usuario idUsuario;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
  private Collection<DetPedido> detPedidoCollection;

  // Getters and Setters //

これは私の DetPedido エンティティです:

@Entity
public class DetPedido implements Serializable {
  private static final long serialVersionUID = 1L;

  @EmbeddedId
  protected DetPedidoPK detPedidoPK;

  @Basic(optional = false)
  @NotNull
  @Column(name = "CANTIDAD")
  private Integer cantidad;

  @Basic(optional = false)
  @NotNull
  @Column(name = "PRECIO_UNIDAD")
  private Double precioUnidad;

  @JoinColumn(name = "ID_PRODUCTO", referencedColumnName = "ID_PRODUCTO", insertable = false, updatable = false)
  @ManyToOne(optional = false)
  private Producto producto;

  @JoinColumn(name = "ID_PEDIDO", referencedColumnName = "ID_PEDIDO", insertable = false, updatable = false)
  @ManyToOne(optional = false)
  private Pedido pedido;

  // Getters and Setters //

これが私の DetPedidoPK です。

@Embeddable
public class DetPedidoPK implements Serializable {

  @Basic(optional = false)
  @NotNull
  @Column(name = "ID_PEDIDO")
  private Integer idPedido;

  @Basic(optional = false)
  @NotNull
  @Column(name = "ID_PRODUCTO")
  private Integer idProducto;

  // Getters and Setters //

Entities ara はデータベースから自動的に生成され、DetPedidoPK も含まれていますが、Pedido を保存する方法がわかりません。上記のコードで試してみましたが、うまくいきません。

誰でも私を助けることができますか?

ご挨拶。

4

1 に答える 1

3

JPA 1.0 とこのエンティティ モデルを使用している場合は、Producto インスタンスと Pedido インスタンスの両方を永続化およびフラッシュして ID を割り当ててから、それらを参照する DetPedido インスタンスを永続化する必要があります。それが完了したら、DetPedido の DetPedidoPK インスタンスの id 値を手動で設定して、参照された Producto および DetPedido キー値と一致するようにする必要があります。DetPedidoPK 値が設定されていない場合、DetPedido を挿入することはできません。

JPA 2.0 は派生 ID をサポートします。これにより、リレーションシップを @ID または @MapsId としてマークし、リレーションシップに関連付けられた joincolumn から ID 値を取得する必要があることを示します。この場合、次のようになります。

  @ManyToOne(optional = false)
  @MapsId("idProducto")
  private Producto producto;


  @ManyToOne(optional = false)
  @MapsId("idPedido")
  private Pedido pedido;

必要に応じて、DetPedido 内の埋め込み可能オブジェクトを削除し、関係を @Id としてマークするだけで済みます。これは複合であるため、DetPedidoPK を PK クラスとして使用します。

于 2013-07-03T17:35:06.530 に答える