2013-07-03 3 views
1

이 작업에 도움이 필요합니다.복합 기본 키가있는 개체 삽입

@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 법인입니다 :

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 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를 저장하는 방법을 알지 못합니다. 위의 코드로 시도했지만 작동하지 않습니다.

아무도 도와 줄 수 있습니까?

인사말.

답변

3

JPA 1.0과이 엔티티 모델을 사용하는 경우 Producto와 Pedido 인스턴스를 계속 유지하고 플러시하여 참조 할 DetPedido 인스턴스를 유지하기 전에 ID를 할당해야합니다. 이 작업이 끝나면 DetPedido의 DetPedidoPK 인스턴스에서 id 값을 수동으로 설정하여 참조 된 Producto 및 DetPedido 키 값과 일치하도록해야합니다. DetPedidoPK 값이 설정되지 않은 상태에서 DetPedido를 삽입 할 수 없습니다.

JPA 2.0은 관계를 @ID 또는 @MapsId 중 하나로 표시 할 수있는 파생 ID를 지원합니다.이 ID는 관계에 연결된 joincolumn에서 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

관련 문제