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
列
我有一对一的关系:
用户:
@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
列