Java: Mise en veille prolongée @ OneToOne mapping


J'essaie de faire fonctionner les annotations Hibernate @OneToOne et de ne pas avoir beaucoup de succès ici...

Disons que j'ai une table appelée {[3] } 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 {[4] } 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 un 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, j'attends que User.getStatus() retournera Status objet avec id=1. Au lieu de cela, je reçois un AnnotationException: "Propriété référencée pas un (Un|Plusieurs)ToOne: Statut.Id utilisateur dans mappedBy User.statut "

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!

Author: Shaun Scovil, 2014-02-13

1 answers

Votre entité de statut ne doit pas avoir de propriétés userId et contentId de type Integer, mappées avec @Column. Il doit avoir des propriétés user et content de type User et Content, 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.

 68
Author: JB Nizet, 2014-02-13 18:23:01