当前位置: 首页 > 知识库问答 >
问题:

Hibernate MySQL JPA

谷梁襦宗
2023-03-14

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的新手,有人能告诉我如何解决这个问题吗?

共有3个答案

夏奕
2023-03-14
@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列中。

皇甫飞宇
2023-03-14

一对一关系的工作方式确实有点(很多),那么你的代码期望吗?我只是试图在这里解释相同的内容:一对一映射的概念。解释映射。请阅读它。

关键是,在一对一关系中,您的数据库设计有一些限制。该关系基于两个主键。user表中的id键列的值与user_profile列的id值相同。

如果您想使用< code >一对一,您需要

    < li >更改您的表< code>user_profile: < li >它将具有< code>id列,这是不由identity生成的主键。 < li >它不再具有user_id。 < Li > < code > id 将由来自< code >用户实例的NHibernate填充 < Li > < code > user _ profile 的映射必须遵循一对一的“从属”映射

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

看看这里的一个很好的例子:一对一的例子(译注)。在这里你会找到所有的答案和提示如何做那种映射。但也要想想如果一对一的映射正是你所需要的。因为它在现实生活中有点罕见…

上官霄
2023-03-14

您的映射是向后的。@JoinColumn应该在用户上,而不是在用户配置文件上。

 类似资料:

相关问答

相关文章

相关阅读