web-dev-qa-db-ja.com

Java:Hibernate @OneToOneマッピング

私はHibernate @OneToOneアノテーションを機能させようとしていますが、ここではあまり成功していません...

次のようなstatusというテーブルがあるとします。

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

そして、次のようなUserのエンティティを持っています:

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

Contentの同様のもの、およびStatusの別のエンティティは次のようになります。

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

Userで読み取りを実行すると、User.getStatus()が_id=1_でStatusオブジェクトを返すことが予想されます。代わりに、AnnotationException: "Referenced property not not(One | Many)ToOne:Status.userId in mappedBy User.status"を取得します

私はここでドキュメント、チュートリアル、およびサンプルをSOに注ぎましたが、今まで試したすべてが失敗しました。

また、注目に値する:いくつかのuserおよびcontentレコードはstatusテーブルに参照を持たないため、これは1対0または1つの関係をサポートする必要があります。

どんな助けも大歓迎です!

23
Shaun Scovil

Statusエンティティには、@ColumnにマッピングされたInteger型のuserIdおよびcontentIdプロパティを含めることはできません。タイプがUserおよびContentで、@OneToOneでマップされたプロパティuserおよびcontentが必要です。

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

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

ユーザーには1つのステータスがあります。ステータスには1人のユーザーがいます。

71
JB Nizet