0

1)我有 2 个表,用户和 user_profile 与OneToOne关系,

用户表:

id,user_name,first_name,last_name - ID 有主键,

用户资料:

id,name,user_id - ID 有主键,user_id 有外键和用户表

2) 以下是两个 JPA Entity 对象

用户:

@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 表中,并且在USER_PROFILE 表的列user_id中看不到任何值。user_id

我是这个 MySQL 的新手,有人可以阐明如何解决这个问题吗?

4

5 回答 5

0

正如其他人提到@JoinColumn的那样,放在错误的桌子上。它应该包含在关系的拥有方,即包含外键的表中。在您的情况下,该表是UserProfile.

用户资料

@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(cascade = {CascadeType.ALL})
    @JoinColumn(name="user_id")
    private User user;

    // with set/get methods
}

用户

@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(mappedBy="user")
    public UserProfile userProfile;

    //with set/get methods
}

有关更多详细信息,请参阅我关于确定实体的拥有方的博客条目。

于 2013-06-23T08:17:33.140 回答
0

这种one-to-one关系确实有点(很多)不同,那么你的代码期望?我只是想在这里解释一下:一对一映射的概念。解释映射。请阅读。

关键是,相对而言one-to-one,您的数据库设计存在一些限制。该关系基于两个主键。表中的id键列与.useriduser_profile

如果你想使用one-to-one你需要

  • 改变你的桌子user_profile
  • 它将有 column id,主键不是由身份生成的。
  • 它不再有 user_id。
  • id将由 NHibernate 从实例user填充
  • 的映射user_profile必须遵循一对一的“从”映射

映射的小草稿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;

在这里查看一个很好的示例: 一对一示例(注释)。在这里,您将找到如何进行这种映射的所有答案和提示。但也要考虑一对一映射是否正是您所需要的。因为在现实生活中很少见……

于 2013-06-23T05:51:13.157 回答
0

您的映射是向后的。@JoinColumn 应该在用户上,而不是 userProfile。

于 2013-06-23T05:43:09.760 回答
0
@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 列中。

于 2013-06-23T06:24:12.153 回答
0

一对一关系基于外键概念,其中一个表的主键用作您用于分类的代码中其他表的普通列

  1. 用户

  2. 用户资料

但不是在UserProfile表的 id 上使用@joinColumn ,而是在其他列上使用它

所以 make 是正确的加入应该在主键上而不是在其他列上进行。

主键不应该由身份生成。

于 2013-06-23T07:10:14.077 回答