当前位置: 首页 > 知识库问答 >
问题:

春靴冬眠中@OneToOne的真正目的是什么?

东门俊智
2023-03-14

我有两个名为用户和从属的实体。我想在这两个实体之间建立一种一刀切的关系。正如OneToOne的真正含义所述-

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

但当我将@OneToOne添加到Dependents实体时,它并不能阻止我将两个Dependent添加到同一个用户。@OneToOne或任何其他关系注释(如@manytomy、@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;
    }
}

还有我的家属服务。java我正在保存Dependents对象,如-

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

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

共有2个答案

鲁洋
2023-03-14

Hibernate不会进行任何额外的检查以确保记录已经存在。您有责任编写满足OneToOne关系的代码(这也取决于您的UI屏幕)。若仍要引发某些异常,请将主键作为依赖表中的外键。然后您会得到DB异常。

黄弘盛
2023-03-14

从Hibernate文档:

从关系数据库的角度来看,底层模式与单向@manytone关联相同,因为客户端根据外键列控制关系。

...

如果手机是父端,则映射更自然,因此将外键推到PhoneDetails表中。此映射需要双向@OneToOne关联

...

当使用双向@OneToOne关联时,Hibernate在获取子端时强制执行唯一约束。如果有多个子级与同一父级关联,Hibernate将抛出一个组织。冬眠例外ConstraintViolationException。

因此,您应该使用双向一对一关联。

其他信息:映射@OneToOne与JPA和Hibernate关系的最佳方法

 类似资料:
  • 我有两个类,“article”包含对“surchargegroup”的@manytoone引用,该“surchargegroup”指定了该文章的附加费。 另一个类“SurchargeGroup”包含一个父对象引用,它可以将附加费继承到“SurchargeGroup”,如果没有设置,则任何父对象都不提供附加费的情况是不可能的。 我现在的问题是,如果我调用“getSurcharge()”方法,我会得到

  • 另一种方法是使用Crieteria关联,但关联只能与和一起工作! 请在这里帮帮我。

  • 我正在阅读一些关于Hibernate的面试问题,并遇到了Hibernate派生的属性。我正在使用@Formula注释尝试一个简单的示例,但它不起作用。谁能告诉我我错过了什么。下面的代码片段 输出和SQL查询显示在最后。 实体(Employee.java) hibernate.cfg.xml 测试类导入org.hibernate.会话;导入org.hibernate.会话工厂;导入org.hiber

  • 这是财产, 编译过程中会抛出此错误, 原因:org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:在表[产品]中的列[描述]中遇到错误的列类型;找到[long text(类型#LONGVARCHAR)],但期望[varchar(255)(类型#VARCHAR)] 我错过了什么?

  • 配置类的应用程序侦听器时出现错误 这实际上是我的错误 ** 严重:配置类org的应用程序侦听器时出错。springframework。网状物上下文ContextLoaderListener java。lang.NoClassDefFoundError:javax/servlet/ServletContextListener **在爪哇。lang.ClassLoader。java上的findBoot

  • 我想在我的Junit5单元测试中将值注入到带有@Value注释的私有字段。 我引用了这个,并使用了ReflectionTestUtils。setField通过注入值解决了我的问题,但在验证方法被调用的次数时失败。 MyClass(我的类别): 测试类: 运行上述测试时出错 我想kafkaTemplate.sendMessage();被调用一次,但被调用两次后添加反射TestUtils。 需要关于如