Spring mvc hibernate,主键不改变外键的值

Spring mvc hibernate, primary key not changing value of foreign key

我有一对一的关系:

用户:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
private String firstName;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "userId")
Employee employee;

员工:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
int id;
@NotNull
int userId;
String lastName;

用户资料库:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> { }

所以我通过这种方式创建了一个用户和员工:

User user = new User();
user.setFirstName("George");

Employee employee = new Employee();
employee.SetLastName("Iliev");

user.setEmployee(employee);
userRepository.save(user);

用户 ID 正在自动递增并且有效。但是当我select all from employees的时候,userId一直是0。即使我插入10个用户+10个员工,每个userId都是=0。

为什么?以及如何修复它?

编辑: Exception thrown:

Controller code for inserting

User.java

Employer.java

为什么 userId 总是 0

您的 userId 属性 没有任何注释告诉 JPA 它是一个外键。因此,userId 被视为普通字段。当 Employee 被实例化时, userId 将没有价值。当一个 primitive int 没有值时,它默认为 0.

建议的解决方案

将 属性 从 int userId 更改为 User user 并使用以下 @OneToOne 注释对其进行注释:

@NotNull
@OneToOne(mappedBy = "employee")
User user;

然后要获得 userId,只需调用 user.getId()

如何使用@JoinColumn

这指定了您 table 中的列。为了简单起见,使用它来注释您的外键 属性 并给它一个 suitable 名称。确保它不与现有列名称冲突。

@JoinColumn(name = "employee_id")
Employee employee;

您可以省略 referencedColumnName,因为这将自动设置为引用实体的主键列名称。

有关注释的更详细答案,请查看 this answer 中的一个很好的示例。

首先改变

@NotNull
int userId;

@NotNull
@OneToOne(mappedBy = "employee")
User user;

二、改变

@JoinColumn(name = "id", referencedColumnName = "userId")
Employee employee;

@JoinColumn(name = "employee_id")
    Employee employee;

因为上面已有名为 "id" 的列(您的主键)。您还必须从员工 table.

中删除 useId