您可以使用实体的类作为IdClass的参数。那是不对的。应该使用Id类别。另外,不需要连接实体中ID的单独字段。
在下面查找类似代码的内容。我不能保证它可以在这样的旧版本的Hibernate中工作,但是可以肯定地在任何一个版本中都不能工作。值得尝试。如果要使用JPA
2.0功能,则至少升级到3.5.X版本(甚至是更新的版本)不会有什么坏处。构造函数/等式等被删除以节省空间。
@Entity@Table(name = "Orders")public class Order { @Id Long id; @oneToMany(mappedBy="order") private List<OrderDetail> orderItems;}@Entity@Table(name="PRODUCTS")public class Product { @Id Long id; @oneToMany(mappedBy="product") private List<OrderDetail> orderItems;}@Entity@IdClass(OrderDetailId.class)@Table(name = "ORDER_DETAIL")public class OrderDetail implements Serializable { @Id @ManyToOne @JoinColumn(name = "ORDER_ID") private Order order; @Id @ManyToOne @JoinColumn(name = "PRODUCT_ID") private Product product; @Column(name = "PRICE") private double price; //Maybe you also want to use @TemporalType here @Column(name = "LAST_UPDATED_TIME") private Date lastUpdatedTime;}public class OrderDetailId implements Serializable { private Long order; private Long product;}2017年8月15日更新在JPA 2.1及更高版本中,您无需为复合ID添加类,您可以像这样进行操作:
@Entity@Table(name = "ORDER_DETAIL")public class OrderDetail implements Serializable { @Id @ManyToOne @JoinColumn(name = "ORDER_ID") private Order order; @Id @ManyToOne @JoinColumn(name = "PRODUCT_ID") private Product product; @Column(name = "PRICE") private double price; //Maybe you also want to use @TemporalType here @Column(name = "LAST_UPDATED_TIME") private Date lastUpdatedTime;}


