我需要这方面的帮助。有了代码就更清晰了,这是我要坚持的功能:
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 //
从数据库自动生成的实体ara,也是DetPedidoPK,现在我不知道如何保存Pedido。我尝试了上面的代码,但它不起作用。
有人可以帮我吗?
问候。
最佳答案
如果您使用 JPA 1.0 和此实体模型,那么您需要保留并刷新 Producto 和 Pedido 实例以分配其 ID,然后才能保留将引用它们的 DetPedido 实例。完成此操作后,您将需要在 DetPedido 的 DetPedidoPK 实例中手动设置 id 值,以便它们与引用的 Producto 和 DetPedido 键值匹配。如果未设置 DetPedidoPK 值,则无法插入 DetPedido。
JPA 2.0 支持派生 ID,它允许将关系标记为 @ID 或 @MapsId,指示应从与关系关联的连接列中提取 ID 值。在这种情况下,它将变成:
@ManyToOne(optional = false)
@MapsId("idProducto")
private Producto producto;
@ManyToOne(optional = false)
@MapsId("idPedido")
private Pedido pedido;
如果您愿意,您可以取消 DetPedido 中的可嵌入功能,只需将关系标记为 @Id,并且因为它是复合的,您可以使用 DetPedidoPK 作为 PK 类。
关于jpa - 插入具有复合主键的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454149/