jpa - 插入具有复合主键的对象

标签 jpa composite-key persist embeddable

我需要这方面的帮助。有了代码就更清晰了,这是我要坚持的功能:

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/

相关文章:

java - 无法存储包含特殊字符的消息

java - 今天的jpql日期比较

angularjs - 在angularjs中检测页面卸载

java - JPA 序列化/反序列化嵌套自动生成字段

java - 使 openJPA 仅缓存选定的表

indexing - 如果没有复合索引,Datomic 用户如何应对?

grails - Grails:旧版数据库-带有复合ID的记录不会更新

nHibernate - 存储过程和复合键

java - @ManyToMany 重复条目

macos - 重启机器时避免容器关闭