Java:Hibernate@OneToOne映射
我试图让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_
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