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

时间:2017-11-20 12:15:36

标签: java spring hibernate foreign-keys one-to-one

我有一对一的关系:

用户:

@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;

userRepository:

@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是自动递增和工作。但是当我从员工中选择全部时,userId始终为0.即使我插入10个用户+ 10个员工,每个userId也是= 0.

为什么?以及如何解决它?

编辑: Exception thrown:

Controller code for inserting

User.java

Employer.java

2 个答案:

答案 0 :(得分:1)

为什么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

这指定表格中的列。为简单起见,请使用它来注释外键属性并为其指定合适的名称。确保它不与现有列名冲突。

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

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

有关注释的更详细答案,请查看this answer以获得一个很好的例子。

答案 1 :(得分:0)

首先改变

@NotNull
int userId;

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

其次,改变

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

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

因为您上面已经有一个名为“id”的列(您的主键)。您还必须从员工表中删除useId列。