Java hibernate复合密钥映射外键问题

Java hibernate复合密钥映射外键问题,java,mysql,hibernate,Java,Mysql,Hibernate,这是我的 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<

这是我的

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 
}
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();
    }
和last 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

}
遇到一些错误

org.hibernate.id.IdentifierGenerationException:为类Model.orderitem生成的空id

当我只保存用户和订单部分的代码是工作

添加保存orderitem代码后,出现问题

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

但我不知道如何修复它

谁能看出我做错了什么


谢谢。

您需要使用@MapsId将oid和pid映射到EmbeddedId中。 @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
}

您需要使用@MapsId在EmbeddedId中映射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
}

谢谢,但我尝试了您的方法,仍然出现问题“无法通过反射设置字段值[9]值:[class Model.orderitem\u PK.oid]Model.orderitem\u PK.oid的setter”,并且值[]将在每次尝试时累积,奇怪的是,如果您想使用@MapsId设置这些字段,您需要在orderitem_PK中设置oid和pid的getter和setter。我在orderitem_PK中确实有getter和setter。我只是忘了在orderitem对象中设置orderitem_PK。setOrderitem_PK(新的orderitem_PK());谢谢,但我尝试了您的方法,仍然出现问题“无法通过反射设置字段值[9]值:[class Model.orderitem\u PK.oid]Model.orderitem\u PK.oid的setter”,并且值[]将在每次尝试时累积,奇怪的是,如果您想使用@MapsId设置这些字段,您需要在orderitem_PK中设置oid和pid的getter和setter。我在orderitem_PK中确实有getter和setter。我只是忘了在orderitem对象中设置orderitem_PK。setOrderitem_PK(新的orderitem_PK());
             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);
@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
}