Подтвердить что ты не робот

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() вернет объект status с помощью id=1. Вместо этого я получаю исключение AnnotationException: "Связанное свойство не (One | Many) ToOne: Status.userId в mappedBy User.status"

Я выложил через docs, учебники и примеры здесь, SO, но все, что я пробовал до сих пор, не удалось.

Также стоит отметить: это должно поддерживать отношение "один к нулю" или "один", поскольку некоторые записи User и Content не будут иметь ссылку в таблице status.

Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

У вашего объекта статуса не должно быть свойств userId и contentId типа Integer, отображаемого с помощью @Column. Он должен иметь свойства user и content типа User и Content, отображаемые с помощью @OneToOne:

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

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

Пользователь имеет один статус. Статус имеет одного пользователя.