Saya sedang membangun aplikasi Spring Boot sederhana, dengan 2 entitas:

- Student model

    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
     @Id @GeneratedValue(strategy = GenerationType.IDENTITY)    
     private Long id;
     private String name;
     private String password;
     private boolean active;
     private Date dob;
     private String roles;
     @ManyToOne
     private Training training;
    }

- Training model

    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Training {
      @Id @GeneratedValue(strategy = GenerationType.IDENTITY)   
      private Long id;
      private String name;
      private int duration;
      @OneToMany(mappedBy = "training")
      @JsonIgnore
      private Collection<Student> students;
    }

EDIT

Saya menjalankan aplikasi dengan menambahkan 2 sumber daya di db:

    public static void main(String[] args) {
        SpringApplication.run(MsSchoolingSbApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        
        Training t1=trainingRepo.save(new Training(null,"php", 20, null));
        Training t2=trainingRepo.save(new Training(null,"java", 20, null));
        Student st=new Student(null, "XXXX", "ZZZZ", true,new Date(),"ADMIN",t1);
        Student st2=new Student(null, "XXXXX2", "ZZZZZ2", true,new Date(),"USER",t2);
        studentRepo.save(st);
        studentRepo.save(st2);
    }

AKHIR EDIT

EDIT 2

- StudentRepo
@RepositoryRestController
public interface StudentRepo extends JpaRepository<Student, Long>{

    public List<Student> findByNameStartsWith(String name);
    
    Optional<Student> findByName(String name);
}

- TrainingRepo
  @RepositoryRestController
    public interface TrainingRepo extends JpaRepository<Training, Long> {
    
    }

AKHIR EDIT 2

Saya sudah mencoba memasukkan fetch = FetchType.EAGER atau LAZY, saya juga menambahkan @JsonIgnore tetapi segera setelah saya mengisi db dengan data baru (pelatihan dan siswa) dan menjalankan aplikasi, saya mendapatkan pesan ini:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.schooling.models.Training.students, could not initialize proxy - no Session

Apa yang saya lakukan salah?

-2
Youssef Harkati 8 Mei 2021, 19:08

2 jawaban

Jawaban Terbaik

Jangan gunakan anotasi @Data Lombok di kelas @Entity.

Alasan: @Data menghasilkan metode kode hash(), equals() dan toString() yang menggunakan getter yang dihasilkan. Menggunakan sarana pengambil tentu saja mengambil data baru meskipun properti ditandai dengan FetchType=LAZY.

Di suatu tempat di sepanjang jalan hibernate mencoba untuk mencatat data dengan toString() dan crash

EDIT Anda dapat mengecualikan relasi dari metode toString dengan menambahkan, misalnya dalam kasus saya: @ToString(exclude = {"students"})

0
Youssef Harkati 12 Mei 2021, 02:52
0
Dattq2303 8 Mei 2021, 16:24