我正在努力让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:“referenced属性不是(一个|多个)ToOne:Status.userId in mappedBy User.status”
我已经在这里倾听了文档,教程和示例,但到目前为止我尝试过的所有内容都失败了。
另外值得注意的是:这应该支持一对一或零关系,因为一些user
和content
记录在status
表中没有引用。
非常感谢任何帮助!
答案 0 :(得分:71)
您的状态实体不得包含Integer类型的属性userId
和contentId
,并使用@Column
进行映射。它必须具有“用户和内容”类型的属性user
和content
,并使用@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。