You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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<>();
}

额外检查项

  1. 确认Hibernate配置中hibernate.hbm2ddl.auto设置为create或create-drop,确保Hibernate能重新生成完整的表结构和约束。
  2. 若问题仍存在,可暂时移除Lombok的@Data注解,手动添加getter/setter方法,排除Lombok与JPA注解的潜在冲突。

内容的提问来源于stack exchange,提问作者abdelouadoud laadimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:05:12