Java:Hibernate@OneToOne映射

Java:Hibernate@OneToOne映射,java,hibernate,jpa,one-to-one,hibernate-annotations,Java,Hibernate,Jpa,One To One,Hibernate Annotations,我试图让Hibernate@OneToOne注释正常工作,但在这里没有太多成功 假设我有一个名为status的表,它如下所示: +------------------------------------------------+ | status | +------------------------------------------------+ | id | frn_user_id | frn_content_

我试图让Hibernate@OneToOne注释正常工作,但在这里没有太多成功

假设我有一个名为
status
的表,它如下所示:

+------------------------------------------------+
|                     status                     |
+------------------------------------------------+
| id | frn_user_id | frn_content_id |   status   |
+----+-------------+----------------+------------+
|  1 |     111     |        0       |  "active"  |
+----+-------------+----------------+------------+
|  2 |      0      |       222      | "inactive" |
+----+-------------+----------------+------------+
@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
}
@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
的实体,如下所示:

+------------------------------------------------+
|                     status                     |
+------------------------------------------------+
| id | frn_user_id | frn_content_id |   status   |
+----+-------------+----------------+------------+
|  1 |     111     |        0       |  "active"  |
+----+-------------+----------------+------------+
|  2 |      0      |       222      | "inactive" |
+----+-------------+----------------+------------+
@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
}
@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
}
对于
内容
有一个类似的实体,对于
状态
有另一个实体,如下所示:

+------------------------------------------------+
|                     status                     |
+------------------------------------------------+
| id | frn_user_id | frn_content_id |   status   |
+----+-------------+----------------+------------+
|  1 |     111     |        0       |  "active"  |
+----+-------------+----------------+------------+
|  2 |      0      |       222      | "inactive" |
+----+-------------+----------------+------------+
@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
}
@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:“mappedBy User.Status中引用的属性不是(一个|多个)ToOne:Status.userId”

在这里,我已经阅读了大量的文档、教程和示例,但到目前为止,我所尝试的一切都失败了

还值得注意的是:这应该支持一对零或一关系,因为一些
用户
内容
记录在
状态
表中没有引用


任何帮助都将不胜感激

您的状态实体不得具有整数类型的属性
userId
contentId
,这些属性映射为
@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;
    // ...
}

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

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

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
private Status status;
并且不要在客户实体中为状态字段添加getter和setter。 并将以下代码添加到状态实体

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
这里添加Status实体类中customer字段的getter和setter。
您可以看到一个工作示例。

userId
的类型必须是
User
,上面有
@OneToOne
/
@JoinColumn
。还请注意,您有一个输入错误(contentId/userId),请参见数据库设计思想:也许您可以将您的设计重新考虑为用户和内容之间的多对多关系,状态描述将在该设计中显示为用户属性?谢谢@RC。我没有意识到它必须是一个对象。@Jorge_B是的,DB的设计并不理想,但我暂时无法使用它。谢谢分享。在过去的3天里,我一直被
mappedBy
绊倒。我在谷歌上搜索了这么多的Stackoverflow帖子,但是一点运气都没有。当我浏览您的解决方案时,我记得我在关系的反面创建了
OneToOne
映射中的
java.util.Set
。一旦我删除了
&just create Entity type属性,我的代码就开始工作了。非常感谢你。向上投票。我经历过之后有点困惑。在他的回答中,
Child
拥有
许多玩具
,那么他为什么要用
OneToOne(mappedBy=“Child”)
注释
列出玩具
?为什么不使用
OneToMany
?您还在
状态
中的
用户
上指定了
JoinColumn
,并且在
玩具
中的
儿童
上未指定Vlad Mihalcea。带/不带
JoinColumn
mappedBy的目标是什么?请你澄清我的疑问好吗?这是错误的。应该是一天一次。JoinColumn用于指定联接列的名称。如果不指定一个,Hibernate将使用defaukt名称(这个默认名称的构造方式在JPA规范中指定),我使用的代码与您在这里提到的相同。但我仍然将frn\u用户id设置为null