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

hibernate中拥有方与非拥有方及其在mapped by Element引用中的使用?

顾乐家
2023-03-14

如果关系是双向的,则非所属方必须使用oneToone注释的mappedby元素来指定所属方的关系字段或属性。

但我不知道拥有方和非拥有方到底是什么?

共有1个答案

东郭自强
2023-03-14

双向关系拥有方的想法来自这样一个事实,即在关系数据库中,不存在像对象那样的双向关系。

在数据库中,我们只有外键,其中只有一个表可以有另一个表的外键。让我们举一个不能按预期工作的例子,看看为什么mappedBy是必要的:

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="IDDOCUMENT")
public class IdDocument {
    @ManyToOne
    private Person person;
}

这将不仅创建表PERSONS和IDDOCUMENTS,还将创建第三个表Persons_IDDocuments:

CREATE TABLE persons_iddocument
(
  persons_id bigint NOT NULL,
  iddocuments_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (iddocuments_id) REFERENCES iddocument (id),
  CONSTRAINT pk UNIQUE (iddocuments_id)
)

Hibernate正在数据库上创建两个单向(外键)关系,以实现一个双向对象关系,因为数据库不支持双向关系。

但是我们希望对象关系仅由表IDDOCUMENTS上的外键映射到Person:一个文档只属于一个Person。

不需要额外的表,这将迫使我们在同一个数据库事务中修改Person.IDDocument.Person和IDDocument.Person以保持关系一致。

为了解决这个问题,我们需要配置Hibernate来停止跟踪关系Person.IDDocuments上的修改。Hibernate应该只跟踪IDDocument.Person关系的另一端,为此,我们添加了MappedBy:

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

这意味着“关系这边的修改已经由关系的另一边IdDocument.Person映射,所以不需要在额外的表中单独跟踪它”。

这给了我们想要的映射,但有一个主要的后果:

    null
 类似资料:
  • 问题内容: 为什么需要在MySQL 之后而不是MySQL中放置自己创建的列(例如)? 还有没有其他弊端(编写整个定义而不是列名)? 问题答案: 为什么需要在HAVING之后放置自己创建的列(例如“ select 1 as number”),而不是在MySQL中放置WHERE? 被施加之前,被后应用(并且可以在聚集体筛选)。 在一般情况下,你可以在没有这些条款的引用别名,但允许引用在级别别名,和。

  • 问题内容: 拥有方 到底是什么意思?一些映射示例( 一对多,一对一,多对一 )的解释是什么? 以下文本摘录自Java EE 6文档中 @OneToOne 的描述。您可以在其中看到概念 拥有的一面 。 定义与另一个具有一对一多重性的实体的单值关联。通常不必显式指定关联的目标实体,因为通常可以从被引用对象的类型中推断出该目标实体。如果关系是双向的, 则非拥有方 必须使用OneToOne批注中的mapp

  • 问题内容: 拥有方到底是什么意思?一些映射示例(一对多,一对一,多对一)的解释是什么? 以下文本摘录自Java EE 6文档中@OneToOne的描述。您可以在其中看到概念拥有方面。 定义与另一个具有一对一多重性的实体的单值关联。通常不必显式指定关联的目标实体,因为通常可以从被引用对象的类型中推断出该目标实体。如果关系是双向的,则非拥有方必须使用OneToOne批注中的mappingBy元素来指定

  • 护士通过请购单向三种不同供应品中的一种订购医疗供应品,所有供应品均由供应商提供。 护士 由于项目可以是三种类型中的一种,并且一个项目的申请可能还不存在,所以申请表具有3种供应类型的外键。 问题是:我正确列出的外键都指向3个不同的表,除了其中一个之外,每个条目都没有相应的外键。 我得到以下错误: 第1行错误:ORA-02091:事务回滚 ORA-02291:违反完整性约束(MMM1339.ITEMN

  • 问题内容: 我正在使用JSF / Primefaces构建一个Web应用程序。我需要有一个“常量”类,即由常量组成的类。这些常量主要是导航命令,将在整个应用程序中使用。我这样做的原因是避免临时实例化String。 我如何实现这一点,使常量既可以从支持bean也可以从XHTML文件访问? 我曾尝试使用和使用Singleton模式(Singleton类),但是由于范围问题,我无法使其正常工作。 也许我

  • 我需要创建一个拥有该值的迭代器(允许将 trait 对象包装到 ),并将其作为 值(playground)返回: 我得到以下信息: 实际问题是我有另一个< code>TStorage impl(基于flatbuffers并拥有< code>TProduct的vec)返回< code>Rc实例(不是引用),因此我也需要修改trait和这个impl签名。 我确实理解当前迭代器借用vec对象(并且不移动