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

一对一映射的概念。解释映射

卫阳曜
2023-03-14

如何定义两个类之间的< code >一对一关系?我想我在某个地方出了问题,在概念上。我不知道是什么,但确实是。

让我们假设有两个类命名为 CountryPM

Country
  int c_id
  String name_c

PM
 int c_id
 String name_pm

现在对于一个国家来说,只能有一个PM,PM只能属于一个国家。如何在映射文件中执行此操作?

我在尝试这个:

<class name="pojo.Country" table="country">
      <id name="c_id">
          <generator class="increment" />
      </id>
      <property name="name_c" />
      <one-to-one class="pojo.PM" name="name_pm" />
  </class>

  <class name="pojo.PM" table="pm">
      <id name="c_id">
          <generator class="increment" />
      </id>
      <property name="name_pm"  />
  </class>

但是这种有效的映射只会在运行时产生异常。它说属性name_pm国家类中找不到!但是它在国家类中搜索吗?它应该在PM类中搜索。

也帮我完成这两个类之间的< code >一对一映射。我尝试这个已经有一段时间了。

爪哇代码:

国家

    public class Country {
    private int c_id;
    private String name_c;

    public int getC_id() {
        return c_id;
    }

    public void setC_id(int c_id) {
        this.c_id = c_id;
    }

    public String getName_c() {
        return name_c;
    }

    public void setName_c(String name_c) {
        this.name_c = name_c;
    }

}

首相

    public class PM {
    private int c_id;
    private String name_pm;

    public int getC_id() {
        return c_id;
    }

    public void setC_id(int c_id) {
        this.c_id = c_id;
    }

    public String getName_pm() {
        return name_pm;
    }

    public void setName_pm(String name_pm) {
        this.name_pm = name_pm;
    }

}

共有2个答案

王英奕
2023-03-14

如果你的问题的一部分也是“……我认为我在某个地方,在概念上……”,我想提供一些解释。

首先,One to One的意思是,引用在对象(实例)之间。换句话说,必须有从一个对象到另一个对象的引用。不仅仅是一个常见的简单类型(即Stringname_pmStringname_c

两个对象应该相互引用:

public class PM {
    private Country country;  // reference to an instance of the PM
    ...
}

public class Country {
    private PM pm; // reference to an instance of the Country
    ...
}

在DB级别上,它更为棘手。因为引用基于ID列,并且我们向我们保证,这两个国家PM将始终属于一起,所以我们必须重用 值。

因此,一个对象将扮演Master的角色,例如国家,第二个将根据它分配它的ID。如果我们不遵循这种模式,我们不能确定迟早会出现一些多对一多对多关系。

这就是为什么映射通常是这样的

<class name="pojo.Country" table="country">
    <id name="c_id">
        <generator class="increment" />
    </id>
    <property name="name_c" />
    <one-to-one class="pojo.PM" name="pm" cascade="save-update" />
</class>

<class name="pojo.PM" table="pm">
    <id name="pmid" type="java.lang.Integer">
        <column name="c_id" />
        <generator class="foreign">
           <param name="property">country</param>
        </generator>
    </id>
    <one-to-one name="country" class="pojo.Country" constrained="true" />
</class>

但是一对一的映射确实非常特殊。我想在PM端映射多对上(在DB中引用国家id)可能更合适。这是完全不同的方法,但是…

请试着看看这篇好文章:

  • 一对一示例(XML 映射)
  • 5.1.13. 一对一
雷锋
2023-03-14

问题在于xml映射和Java代码之间的关系。

如果指定

  <one-to-one class="pojo.PM" name="name_pm" />

在您的国家/地区 POJO 中需要有一个名为“name_pm”的字段。

你没有这样的领域。

如果您的Country类有对应PM对象的字段,则应在此处使用该字段的名称。

如果两个类都没有对另一个类的引用,则需要添加一个。

我可能会对您的代码做的是向国家添加一个字段并在映射中使用它的名称。

public class Country {
    private int c_id;
    private String name_c;
    private PM c_pm;

    public int getC_id() {
        return c_id;
    }

    public void setC_id(int c_id) {
        this.c_id = c_id;
    }

    public String getName_c() {
        return name_c;
    }

    public void setName_c(String name_c) {
        this.name_c = name_c;
    }

    public PM getC_pm() {
        return c_pm;
    }

    public void setC_pm(PM c_PM) {
        this.c_pm = c_pm;
    }

}

映射:

<class name="pojo.Country" table="country">
      <id name="c_id">
          <generator class="increment" />
      </id>
      <property name="name_c" />
      <one-to-one class="pojo.PM" name="c_pm" />
</class>

免责声明

这些我都没有测试过,我也不确定应该如何使用共享主键进行映射。如果其他人想提供一个测试版本,我会很乐意投票支持另一个答案,或者让这个答案变成“社区维基”。

 类似资料:
  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为A表的任何一条记录只能对应B表的一条且唯一一条记录,所以称这种 映射为A表对B表数据的一对一映射。(当然,反过来,你也可是说,是B表对A表的一对多映射)。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图, Pet 中就可以有一个字段 master,通过自身的 masterId 指向一个 Master 对象,那么我们说 Pet.

  • 主要内容:@OneToOne示例,程序输出结果一对一映射映射表示一个单值关联,其中一个实体的实例与另一个实体的实例相关联。在这种类型的关联中,源实体的一个实例可以映射到目标实体的一个实例。 完整的项目目录结构如下所示 - @OneToOne示例 在这个例子中,我们将创建一个学生和图书库之间的一对一关系,这样一个学生只能发放一种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,在包下创建一个实体类,含学生ID()和学生姓名

  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是

  • 问题内容: 我正在尝试在Hibernate中将一对一关系映射为“零或一个”关系。我想我可能已经找到了使用多对一方法。 A类的映射指定: B类的映射指定: 我想在数据库中找不到B的匹配行时b为null。所以我可以做到这一点(在A类中): 但是,看来b永远不会为空。 我该怎么办? 问题答案: 答案是在A中的多对一语句中添加not-found =“ ignore”: 我尝试按照Rob H的建议,简单地向

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对

  • 主要内容:@OneToMany 示例,程序输出结果一对多映射进入集合值关联的类别,其中实体与其他实体的集合关联。 因此,在这种类型的关联中,一个实体的实例可以映射到另一个实体的任意数量的实例。 完整的项目目录结构如下所示 - @OneToMany 示例 在这个例子中,我们将创建一个学生和图书库之间的一对多系,这样一个学生能发放多种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,它包含学生ID(s_id),学生姓名(s_na