2017-03-23 60 views
1

这是我mysql db冬眠复合键映射外键的问题

user.java

@Entity 
@Table(name="user") 

public class user 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 

    private int uid; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy ="user") 
    private Set<order> orders = new HashSet<order>(); 
    // 
    setter ,getter ,and other 
} 

order.java

@Entity 
@Table(name="`order`") 
public class order 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int oid; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name="oid", referencedColumnName="oid") 
    private Set<orderitem> orderitems = new HashSet<orderitem>(); 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="uid") 
    private user user ; 

    ///// 
    setter ,getter and other 

} 

orderitem.java

@Entity 
@Table(name="orderitem") 
public class orderitem 
{ 
    @EmbeddedId 
    private orderitem_PK PK; //composite key 

    @ManyToOne 
    @JoinColumn(name="oid", referencedColumnName="oid" ,insertable = false, updatable = false) 
    private order order; 

    @ManyToOne 
    @JoinColumn(name="pid", referencedColumnName="pid", insertable = false, updatable = false) 
    private product products ; 

    //// 
    setter,getter and other 
} 

orderitem_PK。 java

@Embeddable 
public class orderitem_PK implements Serializable 
{ 

    private int oid; 
    private int pid; 
    public orderitem_PK() {} 

    public orderitem_PK(int oid, int pid) { 
     this.oid = oid; 
     this.pid = pid; 
    } 

    // equals, hashCode 

    @Override 
    public boolean equals(Object obj) { 
     // TODO Auto-generated method stub 
     return super.equals(obj); 
    } 

    @Override 
    public int hashCode() { 
     // TODO Auto-generated method stub 
     return super.hashCode(); 
    } 

和最后product.java

@Entity 
@Table(name="product") 
public class product 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int pid; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name="pid", referencedColumnName="pid") 
    private Set<orderitem> orderitems = new HashSet<orderitem>(); 

    ////////// 
     setter,getter and other 

} 

它是一个网上购物页面

我想这段代码

   order order = new order(); 
      order.setUser(user); 
      order.setOrdertotal(product.getPrice()); 

      Date dt = new Date(); 
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      String nowTime = df.format(dt); 
      java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime); 

      order.setOrderdate(buydate); 

      /// delete this part will work 
      orderitem orderitem = new orderitem(); 
      orderitem.setOrder(order); 
      orderitem.setProducts(product); 
      orderitem.setQuantity(product.getQuantity()); 
      orderitem.setPrice(product.getPrice()); 

      //// 

      session.save(order); 
      session.save(orderitem); 

遇到一些错误插入的数据。

org.hibernate.id.IdentifierGenerationException:用于生成空ID:类Model.orderitem

时,我只保存用户和订单部分的代码工作。

添加保存orderitem代码后,发生问题。

我认为复合键映射外键是错误的。

但我不知道如何解决它。

任何人都可以发现我做错了什么吗?

谢谢。

回答

0

您需要使用@MapsId来映射嵌入ID中的oid和pid。 @MasId为父实体的EmbeddedId主键或简单主键提供映射。 在您的orderItem实体中进行以下更改。

@Entity 
@Table(name="orderitem") 
public class orderitem 
{ 
    @EmbeddedId 
    private orderitem_PK PK; //composite key 

    @ManyToOne 
    @MapsId("oid") // maps the order id attribute of embedded id 
    @JoinColumn(name="oid", referencedColumnName="oid" ,insertable = false, updatable = false) 
    private order order; 

    @ManyToOne 
    @MapsId("pid") // maps the product id attribute of embedded id 
    @JoinColumn(name="pid", referencedColumnName="pid", insertable = false, updatable = false) 
    private product products ; 

    //// 
    setter,getter and other 
} 
+0

谢谢,但我尝试用自己的方式,仍然occurre问题“无法设置字段值[9]通过反射值:类Model.orderitem_PK.oid] Model.orderitem_PK.oid的二传手”和值]会累积每次我尝试,这很奇怪 – alan14alan

+0

如果你想使用@MapsId设置这些字段,你需要在orderitem_PK中拥有oid和pid的getter和setter。 – shubham

+0

我确实在getitem_PK中有getter和setter。我忘了说它 – alan14alan