JPA中带@OneToMany关联的@Entity类所有值能否存入同一单表
错误根因
你遇到的报错onetomany attribute value type should not be embeddable核心是两个问题:
@OneToMany注解只能用于关联@Entity修饰的实体类,不能关联@Embeddable修饰的可嵌入类- 你当前的一对多实体设计是双表存储结构,和你要求的「所有字段存入同一张表、每条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
相关产品推荐
相关产品推荐

