我有一对一的关系:
用户:
@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.
为什么?以及如何解决它?
答案 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(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
列。