Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
325 views
in Technique[技术] by (71.8m points)

java - The concept for one-to-one mapping. Explain the mapping

How to define a One-to-One relation between 2 classes ? I think I am going wrong somewhere,conceptually. I don't know what ,but it is.

Let us suppose there are two classes named Country and PM :

Country
  int c_id
  String name_c

PM
 int c_id
 String name_pm

Now for one country, there can only be one PM and PM can belong only to one country. How do I do this in my mapping file ?

I was trying this :

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

But this effete mapping does nothing than to produce an exception during run time.It says the property name_pm cannot be found inside the Country class ! But does it search inside the Country class. It should rather search inside the PM class.

Also help me accomplish my one-to-one mapping between the 2 classes. I have been trying this for some time.

Java Code:

Country

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

}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The problem is in the relation between your xml mapping and your Java code.

If you specify

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

there needs to be a field named "name_pm" in your Country POJO.

You don't have such a field.

If your Country class has a field for the corresponding PM object, that field's name should be used here.

If neither class has a reference to the other, you need to add one.

What I would probably do with your code is to add a field to country and use its name in the mapping.

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

}

Mapping:

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

Disclaimer:

I haven't tested any of this, and I'm not sure of exactly how the mapping should be done with a shared primary key. If anyone else feels like providing a tested version, I'll happily upvote another answer or let this one turn "community wiki".


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...