@OneToOne

Association particulière utilisée pour une relation réflexive par exemple table employe <-> employeur
Par exemple, le cas où on veut alléger une table qui pourrait avoir trop de données exemple movie <- movie_details

Relation @OneToOne

Lors du chargement de Movie, Hibernate doit savoir s’il doit initialiser MovieDetails à null OU avec un proxy : il charge pour cela MovieDetails

Dans notre exemple ici, on a mis en place une association uni-directionelle entre Movie et MovieDetails. Lors du chargement de Movie, Hibernate var charger automatiquement MovieDétails même si on définit le chargement fetch=FetchType.LAZY sur @OneToOne dans MovieDetails

package com.hibernate4all.tutorial.domain;

import javax.persistence.*;
import java.util.Objects;

@Entity
@Table(name = "movie_details")
public class MovieDetails {
    // Cet id n'a pas de colonne dans la table et ne sera pas généré donc pas de @GeneratedValue
    // Par contre il représente quand meme l'id de cette entity et il faut le renseigner voir @MapsId
    // en le référançant par l'attribut movie (ligne 18)
    @Id
    private Long id;

    @Column(length = 4000)
    private String plot;

    // @OneToOne est une relation particulière unidirectionnelle
    // Quand on charge la relation Movie vers MovieDetails, et même si on charge cette relation en lazy, Hibernate charge automatiquement MovieDetails
    // Quand on charge Movie
    // En outre, lors du chargement de Movie, Hibernate doit savoir s'il doit initialiser MovieDetails à null ou avec un proxy : il charge pour cela MovieDetails
    // @MapsId map une clé primaire et est utilisable sur une relation @ManyToOne ou @OneToOne
    @OneToOne
    @MapsId // Annotation permettant de renseigner la référence de clé primaire pour l'attribut id (L12)
    private Movie movie;

    public Long getId() {
        return id;
    }

    public MovieDetails setId(Long id) {
        this.id = id;
        return this;
    }

    public String getPlot() {
        return plot;
    }

    public MovieDetails setPlot(String plot) {
        this.plot = plot;
        return this;
    }

    public Movie getMovie() {
        return movie;
    }

    public MovieDetails setMovie(Movie movie) {
        this.movie = movie;
        return this;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof MovieDetails)) return false;
        MovieDetails other = (MovieDetails) o;
        if(id == null && other.getId() == null) {
            return Objects.equals(plot, other.getPlot());
        }

        return id != null && Objects.equals(id, other.getId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(59); // pas de clé fonctionnelle donc hascode = numéro arbitraire
    }

}
Langage du code : JavaScript (javascript)