@OneToOne Mapping

Şöyle ki bir Teacher bir TeacherDetail'e sahip olabilir bu ilişkiye Uni-Directional diyoruz.



Ve biz sadece kod içerisinde artık Teacher'dan TeacherDetail'e ulaşabilirken, tam tersi yani TeacherDetail'den Teacher'a gidemeyiz bu süreçte Bi-Directional olarak bilinir ileride yapacağız.


Teacher.java

@Entity
@Table(name = "teacher")
public class Teacher {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
 
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "teacher_detail_id")
    private TeacherDetail teacherDetail;
 
    public Teacher(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }
 
    public Teacher() {
    }
    // getter ve setterlar


TeacherDetail.java

@Entity
@Table(name = "teacher_detail")
public class TeacherDetail {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
    @Column(name = "youtube_channel")
    private String youtubeChannel;
    @Column(name = "hobby")
    private String hobby;
 
    public TeacherDetail() {
    }
 
    public TeacherDetail( String youtubeChannel, String hobby) {
        this.youtubeChannel = youtubeChannel;
        this.hobby = hobby;
    }
    // getter ve setterlar

Teacher.java'da kullandığımız JoinColumn şunu belirtir; Bizim Teacher sütunumuzda bulunan teacherDetail isimli field'ın column ismi ne olsun veritabanıda ? Biz teacher_detail_id olarak bıraktık.


Defaultta cascase'delerde herhangi bir işlem gerçekleşmeyecektir çünkü default olarak herhangi bir cascading yoktur eğer ki biz cascading eklemezsek Teacheri kaydettiğimizde TeacherDetail kayıt olmayacak ve hata fırlatacaktır.


TeacherRepo.java

@Repository
public interface TeacherRepository extends JpaRepository<Teacher, Long>{
 
}


MvcSecApplication.java

@SpringBootApplication
public class MvcsecApplication {
 
    private TeacherRepository teacherRepo;
 
    public static void main(String[] args) {
        SpringApplication.run(MvcsecApplication.class, args);
    }
 
    public MvcsecApplication(TeacherRepository teacherRepo) {
        this.teacherRepo = teacherRepo;
    }
 
    @Bean
    public CommandLineRunner commandLineRunner() {
        return a -> {
            Teacher teacher = new Teacher("Minter", "Coder", "mintercoder@gmail.com");
            TeacherDetail teacherDetail = new TeacherDetail("No Channel", "Hacking");
            teacher.setTeacherDetail(teacherDetail);
            this.teacherRepo.save(teacher);
            System.out.println("Teacher ve TeacherDetail kaydedildi."+teacher.getId()+" "+teacherDetail.getId());
        };
    }
}


Not : @OneToOne için default fetch type "eager"'dir.


Teacheri alalım

Çıktıda ise :

Teacher : Teacher{id=2, firstName=Minter, lastName=Coder, email=mintercoder@gmail.com, teacherDetail=TeacherDetail{id=1, youtubeChannel=No Channel, hobby=Hacking}}

Görürüz çünkü default olarak @OneToOne fetch type eagerdir.