首页 > 解决方案 > Spring boot hibernate中@OneToOne的真正目的是什么?

问题描述

我有两个名为UsersDependents的实体。我想在这两个实体之间建立OneToOne关系。正如 OneToOne 的真正含义所述 -

Users 实体中的每个用户都应该有一个且只有一个依赖项。Dependents 实体中的每个依赖都应该只与一个且只有一个用户相关。

但是,当我将 @OneToOne 添加到 Dependents 实体时,它不会阻止我将两个家属添加到同一个用户。@OneToOne 或任何其他关系注释(如 @ManyToMany、@OneToMany、@ManyToOne)的真正用途是什么?

用户.java

@Entity
@Table
public class Users {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String teamName;
    private Integer salary;

    public Users() {
    }

    public Users(Integer id, String name, String teamName, Integer salary) {
        this.id = id;
        this.name = name;
        this.teamName = teamName;
        this.salary = salary;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTeamName() {
        return teamName;
    }

    public void setTeamName(String teamName) {
        this.teamName = teamName;
    }

    public Integer getSalary() {
        return salary;
    }

    public void setSalary(Integer salary) {
        this.salary = salary;
    }
}

家属.java

@Entity
@Table
public class Dependents {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String relationship;
    @OneToOne
    private Users user;

    public Dependents() {
    }

    public Dependents(int id, String name, String relationship) {
        this.id = id;
        this.name = name;
        this.relationship = relationship;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRelationship() {
        return relationship;
    }

    public void setRelationship(String relationship) {
        this.relationship = relationship;
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
}

在我的DependentsService.java中,我正在保存 Dependents 对象,例如-

public Dependents addNewDependent(Integer userId, Dependents dependent) {
        dependent.setUser(usersRepository.getOne(userId));
        return dependentsRepository.save(dependent);
}

在这里,我使用传递的 userId 从 Users 实体中获取用户并将其存储在 Dependents 对象中。当我为两个或多个家属传递相同的 userId 时,它将从 Users 实体中获取相同的用户并将其存储在 Dependents 实体中。这违反了 OneToOne 关系。有人可以向我解释一下,我怎样才能实现真正的 OneToOne 关系?还请解释关系注释的真正目的是什么 - @OneToOne、@OneToMany、@ManyToOne 和 @ManyToMany?

标签: javahibernatespring-bootspring-dataone-to-one

解决方案


Hibernate 不会做任何额外的检查来确保记录已经存在。您有责任编写满足 OneToOne 关系的代码(这也取决于您的 UI 屏幕)。如果您仍然想抛出一些异常,请将您的主键设置为依赖表中的外键。然后你得到数据库异常。


推荐阅读