JPA嵌入DeliveryOrder时如何为ProductDes列表关联表指定自定义名称
解决方法
ProductDes本身是标注了@Entity的独立实体类,要自定义它对应的数据库表名,直接给该类添加@Table注解、指定name属性为你想要的表名即可。
另外你现有代码需要补全2处配置,否则运行会报错:
- 给
DeliveryOrder类添加@Embeddable注解,才能支持被@Embedded嵌入到FailedDeliveryOrder的表中 - 修正代码里的类名笔误(构造方法名、泛型类型拼写错误)
修改后的DeliveryOrder.java示例
// 补上@Embeddable注解 @Embeddable public class DeliveryOrder { @Entity // 此处指定自定义表名,替换为你需要的名称即可 @Table(name = "custom_product_des_table") public static class ProductDes { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; // 修正构造方法名和类名一致 public ProductDes() {} // setter and getter } @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) @JoinColumn( name = "DeliveryOrder_ID", nullable = false ) @OrderColumn( name = "ProductDes_Position", nullable = false ) // 修正泛型类型拼写 private List<ProductDes> product_descriptions = new ArrayList<ProductDes>(); public DeliveryOrder() { } public DeliveryOrder(List<ProductDes> products) { this.setProduct_descriptions(products); } public List<ProductDes> getProduct_descriptions() { return product_descriptions; } public void setProduct_descriptions(List<ProductDes> product_descriptions) { this.product_descriptions = product_descriptions; } }
额外说明:自定义中间关联表的情况
如果你后续不想把外键存放在ProductDes表中,想要单独生成关联中间表,可以用@JoinTable注解自定义中间表的名称:
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) // 自定义中间关联表配置 @JoinTable( name = "delivery_order_product_rel", // 自定义中间表名称 joinColumns = @JoinColumn(name = "delivery_order_id"), inverseJoinColumns = @JoinColumn(name = "product_des_id") ) @OrderColumn( name = "ProductDes_Position", nullable = false ) private List<ProductDes> product_descriptions = new ArrayList<ProductDes>();
内容的提问来源于stack exchange,提问作者Constantine Lee
相关产品推荐
相关产品推荐

