web-dev-qa-db-fra.com

Java: mappage Hibernate @OneToOne

J'essaie de faire fonctionner les annotations Hibernate @OneToOne et je n'ai pas beaucoup de succès ici ...

Disons que j'ai une table appelée status qui ressemble à ceci:

+------------------------------------------------+
|                     status                     |
+------------------------------------------------+
| id | frn_user_id | frn_content_id |   status   |
+----+-------------+----------------+------------+
|  1 |     111     |        0       |  "active"  |
+----+-------------+----------------+------------+
|  2 |      0      |       222      | "inactive" |
+----+-------------+----------------+------------+

Et j'ai une entité pour User qui ressemble à ceci:

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "userId")
    private Status status;

    // getters and setters
}

Et une similaire pour Content, et une autre entité pour Status qui ressemble à ceci:

@Entity
@Table(name = "status")
public class Status {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;

    @Column(name = "frn_user_id")
    private Integer userId;

    @Column(name = "frn_content_id")
    private Integer contentId;

    @Column(name = "status")
    private String status;

    // getters and setters
}

Lorsque j'effectue une lecture sur User, je m'attends à ce que User.getStatus() renvoie un objet Status avec id=1. Au lieu de cela, j'obtiens une AnnotationException: "La propriété référencée n'est pas un (un | plusieurs) ToOne: Status.userId dans mappedBy User.status"

J'ai parcouru des documents, des tutoriels et des exemples ici sur SO, mais tout ce que j'ai essayé jusqu'à présent a échoué.

À noter également: cela devrait prendre en charge une relation un à zéro ou un, car certains enregistrements user et content n'auront pas de référence dans la table status.

Toute aide serait grandement appréciée!

23
Shaun Scovil

Votre entité Status ne doit pas avoir les propriétés userId et contentId de type Integer, mappées avec @Column. Il doit avoir les propriétés user et content de type Utilisateur et Contenu, mappées avec @OneToOne:

public class User {
    @OneToOne(mappedBy = "user")
    private Status status;
    // ...
}

public class Status {
    @OneToOne
    @JoinColumn(name = "frn_user_id")
    private User user;
    // ...
}

Un utilisateur a un statut. Un statut a un utilisateur.

71
JB Nizet