使用@Inheritance(JOINED)后Hibernate未生成父类外键求助
问题解决:JOINED继承策略下子类表未生成外键关联
问题分析
使用JPA的@Inheritance(strategy = InheritanceType.JOINED)实现多级继承时,Hibernate生成的customers和sellers表仅包含主键id,未自动创建指向父类表的外键约束,导致表间缺乏关联关系。
解决方案
在每个子类上显式添加@PrimaryKeyJoinColumn注解,指定外键列名关联父类表的主键,强制Hibernate生成外键约束。
修改后的Customer类
package com.Abdelouadoud.MoroccoCraftsAPI.model.User; import com.Abdelouadoud.MoroccoCraftsAPI.model.Order; import com.Abdelouadoud.MoroccoCraftsAPI.model.Product; import com.Abdelouadoud.MoroccoCraftsAPI.model.Store; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name = "customers") @PrimaryKeyJoinColumn(name = "user_id") // 指定外键列关联users表的id public class Customer extends User{ @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<Store> favoriteStores = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<Product> favoriteProducts = new ArrayList<>(); @OneToMany //1-*关联,一个用户对应多个订单 private List<Order> orders = new ArrayList<>(); public Customer(User user) { super(user); } }
修改后的Seller类
package com.Abdelouadoud.MoroccoCraftsAPI.model.User; import com.Abdelouadoud.MoroccoCraftsAPI.model.Store; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name = "sellers") @PrimaryKeyJoinColumn(name = "customer_id") // 指定外键列关联customers表的id public class Seller extends Customer{ @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private List<Store> storeList = new ArrayList<>(); }
额外检查项
- 确认Hibernate配置中
hibernate.hbm2ddl.auto设置为create或create-drop,确保Hibernate能重新生成完整的表结构和约束。 - 若问题仍存在,可暂时移除Lombok的
@Data注解,手动添加getter/setter方法,排除Lombok与JPA注解的潜在冲突。
内容的提问来源于stack exchange,提问作者abdelouadoud laadimi
相关产品推荐
相关产品推荐

