如何根据指定JSON结构编写可作为DAO的Java实体类?
问题分析与代码修正建议
我有一份JSON文件,想要将它实例化为实体类并作为数据访问对象(DAO)使用,但在根据JSON结构定义类的过程中遇到了问题。以下是我尝试编写的代码,麻烦帮忙指点,谢谢!
我编写的代码
public class Person{ @Id @GeneratedValue( strategy = GenerationType.AUTO ) private Long id; private String name; @Embedded private List<Information1> Information1; @Embedded private List<Information2> Information2; public Person(){} //getters and setters @Embeddable @Data public class Information1 { @Id private Long id; private String name; private String rating; public Information1(){} //getter and setters } @Data @Embeddable public class Information2 { @Id private Long id; private List<information> information; public Information2(){} //getter and setters } @Data @Embeddable public class information{ @Id private Long id; private String key1; private String key2; public information(){} //getters and setters } }
JSON结构说明
从提供的JSON文件结构来看,数据格式大致如下:
{ "id": 1, "name": "示例名称", "information1": [ { "id": 101, "name": "信息1名称", "rating": "5" } ], "information2": [ { "id": 201, "information": [ { "id": 301, "key1": "值1", "key2": "值2" } ] } ] }
代码中的问题与修正方案
核心问题点
@Embedded注解误用:该注解仅用于嵌入单个可嵌入对象,不能直接修饰集合类型。集合需要用@ElementCollection搭配@CollectionTable来映射。- 嵌入类冗余
@Id:@Embeddable类是宿主实体的一部分,没有独立主键,不需要添加@Id注解。 - 类名不规范:内部类
information不符合Java大驼峰命名规范,应改为Information。 - 缺少实体注解:
Person类作为DAO实体,需要添加@Entity注解标记为JPA实体。
修正后的代码
import jakarta.persistence.*; import lombok.Data; import java.util.List; @Entity @Data public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; // 映射information1集合,指定关联表和外键 @ElementCollection @CollectionTable(name = "person_information1", joinColumns = @JoinColumn(name = "person_id")) private List<Information1> information1; // 映射information2集合 @ElementCollection @CollectionTable(name = "person_information2", joinColumns = @JoinColumn(name = "person_id")) private List<Information2> information2; public Person() {} @Embeddable @Data public static class Information1 { private String name; private String rating; public Information1() {} } @Embeddable @Data public static class Information2 { // 嵌套集合同样用@ElementCollection映射 @ElementCollection @CollectionTable(name = "information2_details", joinColumns = @JoinColumn(name = "information2_id")) private List<Information> information; public Information2() {} } @Embeddable @Data public static class Information { private String key1; private String key2; public Information() {} } }
修正说明
- 给
Person添加@Entity注解,使其成为JPA可管理的实体类,满足DAO的使用要求。 - 集合字段改用
@ElementCollection+@CollectionTable,明确指定存储集合数据的数据库表名和关联外键,替代错误的@Embedded。 - 移除所有嵌入类中的
@Id,嵌入类依赖宿主实体的主键进行关联存储。 - 修正内部类名为
Information,符合Java命名规范。 - 内部类添加
static修饰,避免依赖外部类实例,符合JPA嵌入类的设计要求。 - 利用Lombok的
@Data注解自动生成getter/setter、构造函数等代码,简化类定义。
如果需要和JSON进行序列化/反序列化(比如使用Jackson),可以添加@JsonProperty注解匹配JSON字段名,确保映射完全一致。
内容的提问来源于stack exchange,提问作者stdinstoud
相关产品推荐
相关产品推荐

