1)我有2张桌子,用户和user_profile一对一关系,
用户表:
id,用户名,名字,姓氏-ID有主键,
用户配置文件:
id,name,user_id-ID具有主键,user _ ID具有用户表的外键
2) 以下是两个JPA实体对象
用户:
@Entity
@Table(name = "user")
public class User{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "user_name",unique=true,nullable=false)
private String name;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name="user_id")
public UserProfile userProfile;
//with set/get methods
}
用户配置文件:
@Entity
@Table(name = "user_profile")
public class UserProfile {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "user_id")
private Long userId;
@OneToOne(mappedBy="userProfile")
private User user;
// with set/get methods
}
当我试图插入到两个表中时,我看到user_id
列被添加到带有值的USER表中,而我在USER_PROFILE表的user_id
列中看不到任何值。
我是这个MySQL的新手,有人能告诉我如何解决这个问题吗?
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name="user_id")
public UserProfile userProfile;
此处的注释意味着您的 USER 表将包含一个列USER_ID该列将是对该表USER_PROFILE的外键引用。这是你所期待的吗?我认为它应该重命名为 USER_PROFILE_ID。
在这里,您没有指定另一个表中的列,因此需要添加:
@JoinColumn(name = "USER_PROFILE_ID", referencedColumnName = "ID")
private UserProfile userProfile;
在UserProfile类中,您可以删除:
@Column(name = "user_id")
private Long userId;
然后,用户的ID应该出现在USER_PROFILE表的USER列中。
一对一
关系的工作方式确实有点(很多),那么你的代码期望吗?我只是试图在这里解释相同的内容:一对一映射的概念。解释映射。请阅读它。
关键是,在一对一
关系中,您的数据库设计有一些限制。该关系基于两个主键。user
表中的id
键列的值与user_profile
列的id
值相同。
如果您想使用< code >一对一,您需要
user_profile
id
映射的小草稿(id是由“外国”而不是身份生成的)
// Anottation
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "field", value = "user"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "id", unique = true, nullable = false)
private Long id;
看看这里的一个很好的例子:一对一的例子(译注)。在这里你会找到所有的答案和提示如何做那种映射。但也要想想如果一对一的映射正是你所需要的。因为它在现实生活中有点罕见…
您的映射是向后的。@JoinColumn应该在用户上,而不是在用户配置文件上。