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

如何根据指定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() {}
    }
}

修正说明

  1. 给Person添加@Entity注解,使其成为JPA可管理的实体类,满足DAO的使用要求。
  2. 集合字段改用@ElementCollection + @CollectionTable,明确指定存储集合数据的数据库表名和关联外键,替代错误的@Embedded。
  3. 移除所有嵌入类中的@Id,嵌入类依赖宿主实体的主键进行关联存储。
  4. 修正内部类名为Information,符合Java命名规范。
  5. 内部类添加static修饰,避免依赖外部类实例,符合JPA嵌入类的设计要求。
  6. 利用Lombok的@Data注解自动生成getter/setter、构造函数等代码,简化类定义。

如果需要和JSON进行序列化/反序列化(比如使用Jackson),可以添加@JsonProperty注解匹配JSON字段名,确保映射完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:55:07