当前位置: 首页 > 面试题库 >

关系所有者在双向关系中意味着什么?

梁兴修
2023-03-14
问题内容

我有一个带有QuestionChoice对象的简单模型。

  • 一个问题有很多选择。
  • 许多选择有一个问题

有两种使用Hibernate来实现的方法

实施一:所有者是选择

Question.java

@OneToMany (mappedBy="question")
private Set choices = new HashSet();

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID")
private Question question;

实施二:所有者方是质询

Question.java

@OneToMany
@JoinColumn (name = "QUESTION_ID")
private Set choices = new HashSet();

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false)
private Question question;

两种实现之间有什么区别?


问题答案:

第一个示例是正常且正确的双向一对多/多对一映射。设置QuestionChoice-attribute(“拥有方”)足以保持关系。内存中的实体图将被弄乱,直到再次从数据库中读取关系的另一端为止。从数据库的角度来看,所有者是持久保存到具有外键列的表的实体(与双向一对一相同)。在规范中对此进行了以下解释:

一对多/多对一双向关系的多面必须是拥有方,因此无法在ManyToOne批注上指定mappingBy元素。
....受

管实体之间的双向关系将根据该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中相反的引用彼此保持一致。在单向一对一和一对多关系的情况下,开发人员有责任确保遵守这些关系的语义。

用JPA术语,由于缺少,您的第二个示例没有所有权mappedBy。相反,您有两个单向关系,它们被迫使用与存储相同的列。至少对于Hibernate
3.5.6,它将表现为以下方式:

  • 设置Questionchoice-attribute将不会保持关系。
  • 添加Choicequestion-attribute将不会保持关系。
  • "QUESTION_ID"设置两者的持久值(是,也不能insertable question)。


 类似资料:
  • 我试图在用户和地址之间建立双向关系, 用户1-------->*地址 但是 地址1-------->1个用户 我在上网时得到了这些信息 > 对于一对一双向关系,拥有方对应于包含对应外键的方 双向关系的反向侧必须通过使用OneToOne、 OneToMany或ManyToMany批注的mappedBy元素来引用其 所属侧。mappedBy元素指定作为 关系所有者的实体中的属性或字段。 但如果我按照情

  • 问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系

  • 问题内容: 我知道这要求声明的作用。 但是有时候我在要求之后看到了两个括号。 问) 这是什么意思,它是如何工作的? 问题答案: 这是一种将所需模块的设置为功能的模式。要求该模块返回一个函数,并在require之后的括号中使用参数对函数求值。 在上面的示例中,您的文件如下所示: 这种模式通常用于将变量传递给模块,就像上面用变量所见。

  • 问题内容: $(‘button’).click(function () { 我的问题:尽管我打了个电话,为什么它仍然会提醒下一个号码?就像:忽略下面的代码,然后继续下一个元素 问题答案: 除了引发异常外,没有其他方法可以停止或中断循环。如果您需要这种行为,该方法是错误的工具。 提前终止可以通过以下方式完成: 一个简单的循环 一… 圈 另一个阵列的方法:,,,和测试使用谓词返回truthy值的数组元

  • 我在将带有@ManyToOne关系的实体(雇员)映射到带有@OneToMany关系的实体(社区)时遇到了问题。 当我将一个实体(社区)分配给一个实体(员工),其中社区的值为空时,它工作正常。 问题出现了,如果雇员已经为社区分配了价值。当我更改该值并保存更改时,该员工为社区获得了新的值,并且这个新社区在集合中获得了该员工。唯一的问题是,老社区仍然有这个员工在收集,但它应该被删除。这只有在数据库重新启

  • 我在 angular4 中使用。为此,我创建了 类,该类实现了 接口并提供方法的定义。然后注册提供商进行这样的 这很好。但是我还是不明白这里的< code>multi:true是什么意思?我看过这个回答。 如果我删除了< code>multi:true选项,浏览器端就会出现错误 这是否意味着<code>HTTP_INTERCEPTORS</code>是初始化多个指令或组件的多提供者?如果是,那么还