@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.
@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@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 setterlarTeacher.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.
@Repository
public interface TeacherRepository extends JpaRepository<Teacher, Long>{
}@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.