Todos conocemos la respuesta a la pregunta de qué pueden ser las relaciones entre entidades en Hibernate y JPA . Solo hay cuatro opciones:
OneToOne - uno a uno
OneToMany - uno a muchos
ManyToOne - muchos a uno
ManyToMany - many to many
Cada una de las relaciones tiene su propia anotación y, al parecer, puede terminar la conversación aquí, pero no es tan simple. De todos modos, ¿puede haber algo simple en Hibernate ;) Cada una de las relaciones anteriores puede ser unidireccional o bidireccional, y si no tomas esto en cuenta, puedes enfrentarte a muchos problemas y rarezas.
Por ejemplo, tomemos dos entidades simples: un usuario y un contacto. Obviamente, cada contacto está asociado con un usuario en una relación de varios a uno y un usuario con contactos en una relación de uno a varios.
Relación unilateral
Una relación unidireccional es una relación que pertenece solo a una de las dos partes. De ahí el nombre. Cabe señalar que la otra parte no sabe nada sobre esta relación. Hibernate considerará a la entidad en la que se entregará la anotación de relación como la propietaria de la relación.
Intentemos que el propietario de la relación sea el lado del contacto. Las entidades se verán así.
@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;
// , , ..
}
Si ejecuta este código, Hibernate creará la siguiente estructura de tabla, que nos resulta bastante familiar. La relación entre las tablas se crea utilizando el campo de referencia user_id en la tabla de contactos .
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 .
! , , ! , !
¡Quizás habrá una secuela!