web-dev-qa-db-ger.com

Java: Hibernate @OneToOne-Zuordnung

Ich versuche, Hibernate @OneToOne-Annotationen zum Laufen zu bringen und habe hier nicht viel Erfolg ...

Nehmen wir an, ich habe eine Tabelle mit dem Namen status, die so aussieht:

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

Und ich habe eine Entität für User, die so aussieht:

@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
}

Und eine ähnliche für Content und eine andere Entität für Status, die so aussieht:

@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
}

Beim Lesen von User erwarte ich, dass User.getStatus() ein Status -Objekt mit id=1 Zurückgibt. Stattdessen erhalte ich eine AnnotationException: "Referenzierte Eigenschaft kein (One | Many) ToOne: Status.userId in mappedBy User.status"

Ich habe Dokumente, Tutorials und Beispiele hier auf SO durchgearbeitet, aber alles, was ich bisher versucht habe, ist fehlgeschlagen.

Ebenfalls erwähnenswert: Dies sollte eine Eins-zu-Null-Beziehung oder eine Eins-zu-Null-Beziehung unterstützen, da einige user- und content -Datensätze keinen Verweis in der status-Tabelle enthalten.

Jede Hilfe wäre sehr dankbar!

23
Shaun Scovil

Ihre Status-Entität darf keine Eigenschaften userId und contentId vom Typ Integer haben, die mit @Column Verknüpft sind. Es muss Eigenschaften user und content vom Typ Benutzer und Inhalt haben, zugeordnet mit @OneToOne:

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

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

Ein Benutzer hat einen Status. Ein Status hat einen Benutzer.

71
JB Nizet