【问题标题】:Spring mvc hibernate, primary key not changing value of foreign keySpring mvc休眠,主键不改变外键的值
【发布时间】:2017-11-20 12:15:35
【问题描述】:

我有一对一的关系:

用户:

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

为什么?以及如何解决?

编辑: Exception thrown:

Controller code for inserting

User.java

Employer.java

【问题讨论】:

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


    【解决方案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 以获得很好的示例。

    【讨论】:

    • 我添加了它并得到了异常:Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: com.foo.dto.Employee.userId, referenced property unknown: int.employee
    • 好的,但是如果我将 userId 更改为 User 用户,我应该如何映射:@OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "id", referencedColumnName = "userId") Employee雇员;
    • ConstraintViolationImpl{interpolatedMessage='可能不为空'
    • 您是否删除了数据库中的USER_ID 列?如果没有,请删除该列。因为它现在被命名为employee_id,所以该列未被使用。
    • 是的,我删除了所有表,但仍然:ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=user,
    【解决方案2】:

    首先改变

    @NotNull
    int userId;
    

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

    二、改变

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

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

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

    【讨论】:

    • ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=user,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2014-03-27
    • 2012-03-21
    • 2012-03-15
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多