如何在JPA Entity实体类中存储非实体类型的List集合数据
错误根因
该报错是JPA的映射规则导致的:Hibernate在解析User实体时,无法识别未配置关联规则的List<Feature>字段,Feature既没有被配置为关联实体,也没有被声明为可嵌入类型,框架不知道该如何将这个集合存储到数据库中,因此抛出类型映射异常。
解决方案
不需要把Feature改为实体类,通过JPA自带的@Embeddable+@ElementCollection注解即可实现需求,修改步骤如下:
步骤1:给Feature类添加可嵌入标识
给Feature类加@Embeddable注解,声明该类是可以嵌入到实体中的属性类型:
import javax.persistence.Embeddable; @Embeddable public class Feature { private String fName; private Long fYear; // 请务必补全无参构造方法、所有字段的getter和setter方法,JPA映射强制要求 }
步骤2:给User类的集合字段添加集合映射注解
给features字段加@ElementCollection声明这是嵌入对象集合,还可以通过@CollectionTable自定义存储集合的表名和外键规则:
import javax.persistence.ElementCollection; import javax.persistence.CollectionTable; import javax.persistence.JoinColumn; @Entity public class User extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String firstName; private String lastName; @Column(unique = true) private String mail; private String password; // 新增以下3个注解配置集合映射 @ElementCollection @CollectionTable(name = "user_features", joinColumns = @JoinColumn(name = "user_id")) private List<Feature> features; // 保持原有getter、setter、构造方法即可 }
实现效果
配置完成后启动项目,会自动生成一张名为user_features的附属表,表中包含user_id(关联User表主键)、f_name、f_year三个字段,完全满足你不需要把Feature设为实体类的业务要求。
内容的提问来源于stack exchange,提问作者Emre Varol
相关产品推荐
相关产品推荐

