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

标签 java hibernate jakarta-ee hibernate-mapping

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

假设有两个名为 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>

但是这个无效的映射除了在运行时产生异常之外什么也没做。它表示在 Country 类中找不到属性 name_pm !但它是否在 Country 类内部进行搜索。它应该在 PM 类内部进行搜索。

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

Java 代码:

国家

    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;
    }

}

PM

    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;
    }

}

最佳答案

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

如果您指定

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

您的Country 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>

免责声明:

我还没有对此进行任何测试,并且我不确定应该如何使用共享主键来完成映射。如果其他人想要提供经过测试的版本,我会很乐意投票给另一个答案,或者让这个答案变成“社区维基”。

关于java - 一对一映射的概念。解释映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17250990/

相关文章:

java - 实现 api 包的库包是否应该导出 api 包?

java - 有状态bean不保持状态

java - 更改日期和时间格式 Android

java android错误将异常写入包裹

spring - 冲突的持久性单元定义异常

hibernate - 如何动态设置 JPA 标准查询的位置/命名参数?

spring - 将 Spring Boot 1.3 迁移到 1.4、Hibernate 4 迁移到 5、Pascal 大小写问题

json - 如何轻松使用 Jackson for Jersey

java - Spring MVC - jar 文件是否可以引用不在 jar 文件中的属性文件?

java - 如何将java swing ImageIcon图像保存到文件?