2017-03-23 62 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