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!