Java hibernate复合密钥映射外键问题
这是我的 user.javaJava 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<
@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
}