Relaciones unidireccionales y bidireccionales en Hibernate

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!








All Articles