如何定义2个类之间的One-to-One关系?从概念上讲,我认为我在哪里出错。我不知道那是什么。

让我们假设有两个名为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类中找不到属性Country!但是它是否在Country类内搜索。它应该在PM类中进行搜索。

还可以帮助我完成两个类之间的one-to-one映射。我已经尝试了一段时间。

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

}


下午

    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>


免责声明:

我还没有测试过任何一个,也不确定如何使用共享主键完成映射。如果其他人想提供经过测试的版本,我会很乐意赞成其他答案,或者让它变成“社区Wiki”。

09-25 17:21
查看更多