【问题标题】:Inserting nested entities using Hibernate使用 Hibernate 插入嵌套实体
【发布时间】:2020-08-16 03:18:01
【问题描述】:

我试图弄清楚如何正确地将几个具有另一个实体作为字段的实体插入到数据库中,并且似乎在休眠状态下它是一个不简单的任务。当我把所有东西都整理整齐时它工作得很好,但是一旦它们交叉链接,它就不能按预期工作。我假设我缺少一些必需的注释以使其正常工作,但是经过几个小时的谷歌搜索,我找不到任何合适的方法来迅速解决它。

我当前的实体是这样设置的,我有一个学生和

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
}

我有一个教室,里面有一个通过 id 链接的 Student 实体

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClassRoom {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "student_id", foreignKey = @ForeignKey(name = "fk_student"))
    private Student student;

    private String dateCreated;
}

当我尝试将它存储到数据库中时,我有一个 json 可以完美运行:

{
   "dateCreated":"17",
   "body":[
      {
         "id":1,
         "student":{
            "id":1,
            "name":"petya",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"17"
      },
      {
         "id":2,
         "student":{
            "id":2,
            "name":"petrya",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"17"
      },
      {
         "id":3,
         "student":{
            "id":3,
            "name":"slon",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"17"
      }
   ]
}

Hibernate: select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from json_schema.student student0_ where student0_.id=?
Hibernate: select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from json_schema.student student0_ where student0_.id=?
Hibernate: select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from json_schema.student student0_ where student0_.id=?
Hibernate: select classroom0_.id as id1_0_0_, classroom0_.date_created as date_cre2_0_0_, classroom0_.student_id as student_3_0_0_ from json_schema.class_room classroom0_ where classroom0_.id=?
Hibernate: select classroom0_.id as id1_0_0_, classroom0_.date_created as date_cre2_0_0_, classroom0_.student_id as student_3_0_0_ from json_schema.class_room classroom0_ where classroom0_.id=?
Hibernate: select classroom0_.id as id1_0_0_, classroom0_.date_created as date_cre2_0_0_, classroom0_.student_id as student_3_0_0_ from json_schema.class_room classroom0_ where classroom0_.id=?
Hibernate: update json_schema.class_room set date_created=?, student_id=? where id=?
Hibernate: update json_schema.class_room set date_created=?, student_id=? where id=?
Hibernate: update json_schema.class_room set date_created=?, student_id=? where id=?

但是一旦我尝试保存链接到第三个学生的第二个教室条目,例如这样:

{
   "dateCreated":"10",
   "body":[
      {
         "id":1,
         "student":{
            "id":1,
            "name":"petya",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"10"
      },
      {
         "id":2,
         "student":{
            "id":3,
            "name":"slon",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"10"
      },
      {
         "id":3,
         "student":{
            "id":2,
            "name":"petrya",
            "hibernateLazyInitializer":{

            }
         },
         "dateCreated":"10"
      }
   ]
}

Hibernate: select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from json_schema.student student0_ where student0_.id=?
Hibernate: insert into json_schema.student (name) values (?)
Hibernate: select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from json_schema.student student0_ where student0_.id=?
Hibernate: insert into json_schema.student (name) values (?)
Hibernate: update json_schema.student set name=? where id=?
Hibernate: select classroom0_.id as id1_0_0_, classroom0_.date_created as date_cre2_0_0_, classroom0_.student_id as student_3_0_0_ from json_schema.class_room classroom0_ where classroom0_.id=?
Hibernate: insert into json_schema.class_room (date_created, student_id) values (?, ?)
Hibernate: select classroom0_.id as id1_0_0_, classroom0_.date_created as date_cre2_0_0_, classroom0_.student_id as student_3_0_0_ from json_schema.class_room classroom0_ where classroom0_.id=?
Hibernate: insert into json_schema.class_room (date_created, student_id) values (?, ?)

它打破了:

错误:在表“class_room”上插入或更新违反了外键约束“fk_student” 详细信息:键 (student_id)=(3) 不存在于表“student”中。

这可能是我正在实现的逻辑,我正在尝试以这种方式存储它们:

final ClassRoom[] classRooms = objectMapper.readValue(parser, ClassRoom[].class);
        final List<ClassRoom> classRoomList = Arrays.asList(classRooms);
        final List<Student> studentsList = new ArrayList<>();
        for (final ClassRoom classRoom : classRoomList) {
            studentsList.add(classRoom.getStudent());

        }
        studentRepo.saveAll(studentsList);
        classRoomRepo.saveAll(classRoomList);

但我不知道如何首先单独存储学生,只有在存储 classRooms 之后。 感谢任何帮助。希望会随着时间的推移解决它,如果是这样,我会自己发布一个答案。

【问题讨论】:

    标签: sql hibernate annotations entity


    【解决方案1】:

    您的 id 方法是 @GeneratedValue(strategy = GenerationType.IDENTITY),而您的学生和教室列表都预先填充了 id。如果你想让这些 id 保持在 json 中,请删除 @GeneratedValue(strategy = GenerationType.IDENTITY) 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 2017-10-14
      • 2019-11-16
      • 2021-10-12
      • 2019-08-07
      • 2016-06-17
      • 2020-10-30
      • 2016-10-07
      相关资源
      最近更新 更多