Java:Hibernate @OneToOne映射

时间:2014-02-13 18:17:16

标签: java hibernate jpa one-to-one hibernate-annotations

我正在努力让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()将返回Statusid=1对象。相反,我得到一个AnnotationException:“referenced属性不是(一个|多个)ToOne:Status.userId in mappedBy User.status”

我已经在这里倾听了文档,教程和示例,但到目前为止我尝试过的所有内容都失败了。

另外值得注意的是:这应该支持一对一或零关系,因为一些usercontent记录在status表中没有引用。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:71)

您的状态实体不得包含Integer类型的属性userIdcontentId,并使用@Column进行映射。它必须具有“用户和内容”类型的属性usercontent,并使用@OneToOne进行映射:

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

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

用户有一个状态。状态有一个用户。

答案 1 :(得分:0)

使用这种方式。在客户实体中添加以下字段。

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

,请勿在客户实体的状态字段中添加获取器和设置器。 并将以下代码添加到状态实体​​。

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;

在“状态实体”类中为客户字段添加获取器和设置器。 您可以看到一个有效的示例here