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

JPA中带@OneToMany关联的@Entity类所有值能否存入同一单表

错误根因

你遇到的报错onetomany attribute value type should not be embeddable核心是两个问题:

  1. @OneToMany注解只能用于关联@Entity修饰的实体类,不能关联@Embeddable修饰的可嵌入类
  2. 你当前的一对多实体设计是双表存储结构,和你要求的「所有字段存入同一张表、每条Records对应一行」的需求完全不匹配

可行实现方案

你不需要拆分两个类做实体关联,直接按单表结构设计实体,JSON反序列化时将外层公共字段赋值给每一条Records对象即可,步骤如下:

1. 修正实体类设计

import lombok.*;
import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Table(name = "GET_RECORDS")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class TransactionRecord {
    @Id
    @NotNull
    private String CRN;
    
    private String Action;
    // 注意:原JSON中Rec_count是字符串类型,如果实际是数字可自行调整为int,做类型转换即可
    private String Rec_count;
    private String Page_count;
    // 注意:原JSON中Pan值为字符串(如"abcd"),你之前写的int类型会报错,这里修正为String
    private String Pan;
}

2. 适配JSON解析逻辑

以Jackson解析为例,你可以先定义一个接收完整JSON结构的DTO类,不需要加JPA注解:

import lombok.Data;
import java.util.List;

@Data
public class TransactionDTO {
    private String Action;
    private String Rec_count;
    private String Page_count;
    private List<TransactionRecord> Records;
}

解析JSON后遍历Records列表,将外层的Action、Rec_count、Page_count赋值给每一个TransactionRecord对象,最后直接批量保存这些实体对象即可,最终表中每条数据都会包含所有字段,完全符合你的需求。

可选优化方案(公共字段复用)

如果你有多处需要用到这三个公共字段,可以封装为可嵌入类,再嵌入到实体中:

// 公共字段可嵌入类
import lombok.Data;
import javax.persistence.Embeddable;

@Data
@Embeddable
public class CommonInfo {
    private String Action;
    private String Rec_count;
    private String Page_count;
}

// 实体类调整为
@Table(name = "GET_RECORDS")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class TransactionRecord {
    @Id
    @NotNull
    private String CRN;
    
    private String Pan;
    // 嵌入公共字段,会自动映射为表的三个列
    private CommonInfo commonInfo;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:45:05