Eğer ki biz TeacherDetail'i yüklerken bize Teacher'da gelmesini istiyorsak işte bu süreç Bi-Directional olarak bilinir.

Bunu da yapmak tek yapmamız gereken bizim TeacherDetail'i güncellemektir.



TeacherDetail.java

@OneToOne(mappedBy = "teacherDetail")
private Teacher teacher;
// getter ve setteri de ekle

Bu kod parçacığını eklemektir.


mappedBy

bu hibernateye şunu söyler; Teacher classı içerisindeki teacherDetail property'sine bak ve bu property'de bulunan @JoinColumn'u kullanarak da Teacher için bilgileri yükle bu sayede ilişkili olunan Teacher'i getirir bize. Tabi istersek buraya da cascasdeType ekleyebiliriz. ALL olarak.

Ana uygulamamızı güncelleyelim.


@Bean
public CommandLineRunner commandLineRunner() {
    return a -> {
        Optional<TeacherDetail> optTeacherDetail = this.teacherDetailRepo.findById(1L);
        TeacherDetail teacherDetail = optTeacherDetail.get();
        System.out.println("Teacher Detail: "+teacherDetail.getTeacher().getFirstName()+" "+teacherDetail.getTeacher().getLastName());
    };
}


TeacherDetailRepository.java


@Repository
public interface TeacherDetailRepository extends JpaRepository<TeacherDetail, Long>{
 
}


Çıktımız şu şekilde gelir.

Teacher Detail: Minter Coder

Eğer ki biz TeacherDetail'de silme işlemini yaparsak Teacher'da silinir. Eğer ki Teacher'in silinmesini istemiyorsak TeacherDetail içerisindeki cascade type'yi şu şekilde güncelleyebiliriz.


@OneToOne(mappedBy = "teacherDetail", cascade = { 
        CascadeType.DETACH,
        CascadeType.MERGE,
        CascadeType.PERSIST,
        CascadeType.REFRESH
    })
    private Teacher teacher;

Şeklinde DELETE olmadan yapıp ayrıca setTeacher(null) şeklinde süreci devam ettirmeliyiz!!!!!!

teacherDetail.getTeacher().setTeacherDetail(null);