2013-07-03 84 views
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 // 

The实体ara从数据库自动生成,也DetPedidoPK,现在我不知道如何保存Pedido。我尝试了上面的代码,但它不起作用。

任何人都可以帮助我吗?

问候。

回答

3

如果您使用的是JPA 1.0和此实体模型,那么在持续引用它们的DetPedido实例之前,您需要持久化并刷新Producto和Pedido实例以分配其ID。完成后,您需要在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类。

+0

太棒了!我做了你对JPA 1.0的解释,它可以工作!谢谢!但我使用的是JPA 2.0,我不知道如何使用'@ MapsId',我改变了'@JoinColumn(name =“ID_PRODUCTO”,referencedColumnName =“ID_PRODUCTO”,insertable = false,updatable = false)' '@MapsId(“idProducto”)'但它不起作用,也许我必须改变更多的东西。再次感谢! – Alavaros

+1

我有一个类似的问题(解决) http://stackoverflow.com/questions/20146155/jpa-hibernate-tries-to-store-too-many-parameters-in-entity-with-composite-id-an – razor