Hubungan satu arah dan dua arah dalam Hibernate

Kita semua tahu jawaban atas pertanyaan tentang hubungan antara entitas dalam Hibernate dan JPA . Hanya ada empat opsi:





  • OneToOne - satu lawan satu





  • OneToMany - satu ke banyak





  • ManyToOne - banyak menjadi satu





  • ManyToMany - banyak ke banyak





Masing-masing hubungan memiliki anotasi sendiri dan, tampaknya, Anda dapat mengakhiri percakapan di sini, tetapi tidak sesederhana itu. Bagaimanapun, dapatkah ada sesuatu yang sederhana dalam Hibernate ;) Masing-masing hubungan di atas bisa searah atau dua arah, dan jika Anda tidak memperhitungkannya, Anda dapat menghadapi banyak masalah dan keanehan.





Misalnya, ambil dua entitas sederhana: pengguna dan kontak. Jelas, setiap kontak dikaitkan dengan pengguna dalam hubungan banyak-ke-satu, dan pengguna dengan kontak dalam hubungan satu-ke-banyak.





Hubungan sepihak

Hubungan satu arah adalah hubungan yang hanya dimiliki oleh salah satu dari dua pihak. Maka nama. Perlu dicatat bahwa pihak lain tidak mengetahui apa-apa tentang hubungan ini. Hibernate akan mempertimbangkan entitas tempat anotasi hubungan akan dikirimkan sebagai pemilik hubungan.





Mari kita coba menjadikan pemilik hubungan sebagai sisi kontak. Entitas akan terlihat seperti ini.





@Entity
@Table(name = "contacts")
public class Contact {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String type;

    @Column
    private String data;

    @ManyToOne
    private User user;
    
    //   , ,   ..
}

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String username;

    //   , ,   ..
}
      
      



Jika Anda menjalankan kode ini, Hibernate akan membuat struktur tabel berikut, yang terlihat cukup familiar bagi kita. Hubungan antar tabel dibuat menggunakan bidang referensi user_id di tabel kontak .





create table contacts (
    id bigint not null auto_increment,
    data varchar(255),
    type varchar(255),
    user_id bigint,
    primary key (id)
) engine=InnoDB;
    
create table users (
    id bigint not null auto_increment,
    username varchar(128) not null,
    primary key (id)
) engine=InnoDB
      
      



Contact . , , . . user Contact User. .





@Entity
@Table(name = "contacts")
public class Contact {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String type;

    @Column
    private String data;
    
    //   , ,   ..
}

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String username;

    @OneToMany
    private List<Contact> contacts;

    //   , ,   ..
}
      
      



, , Hibernate , .





create table contacts (
    id bigint not null auto_increment,
    data varchar(255),
    type varchar(255),
    primary key (id)
) engine=InnoDB;

create table users (
    id bigint not null auto_increment,
    username varchar(128) not null,
    primary key (id)
) engine=InnoDB;

create table users_contacts (
    User_id bigint not null,
    contacts_id bigint not null
) engine=InnoDB;
      
      



Hibernate (join table) users_contacts, contacts, . , , Hibernate . , - .





JoinColumn contacts.





    @OneToMany
    @JoinColumn(name = "user_id")
    private List<Contact> contacts;
      
      



user_id contacts, .





- (owning side) (inverse side). .. . , , . . .





@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String username;

    @ManyToMany
    private List<Role> roles;

    //   , ,   ..
}

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @ManyToMany
    private List<User> users;

    //   , ,   ..
}
      
      



. Hibernate , .





create table roles_users (
    Role_id bigint not null,
    users_id bigint not null
) engine=InnoDB;

create table users_roles (
    User_id bigint not null,
    roles_id bigint not null
) engine=InnoDB;
      
      



, . . Hibernate , , , . mappedBy. , , .





. . users Role .





    //   mappedBy -      - 
    @ManyToMany(mappedBy = "roles")
    private List<User> users;
      
      



Hibernate users_roles.





. , - (many), mappedBy @OneToMany



. ( Contact).





@Entity
@Table(name = "contacts")
public class Contact {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String type;

    @Column
    private String data;

    @ManyToOne
    private User user;
    
    //   , ,   ..
}

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String username;

    @OneToMany(mappedBy = "user")
    private List<Contact> contacts;

    //   , ,   ..
}
      
      



Hibernate .





! , , ! , !





Mungkin akan ada sekuelnya!








All Articles