小弟刚学到hibernate一对一关系映射,
很多教程对一对一的关系映射都会举以下两个类为例
package couples;
public class Husband {
private int id;
private String name;
private Wife wife;
}
package couples;
public class Wife {
private int id;
private String name;
private Husband husband;
}
这两个类互相引用了对方,Husband里面有个Wife,Wife类里面有个Husband
当我见到这两个类的时候我产生了一些关于JAVA编译和运行方面的疑惑,前来请教高手指点如果以上两个类只有一个引用另一个,比如Husband里面有Wife,而Wife里面没有Husand这个属性,对于这种情况,我就觉得很好理解,因为编译Husband的时候,Wife类型是确定了的,而对于以上的两个类互相引用,我始终觉得,当编译Husband时,引用了Wife,编译器会去分析Wife类究竟是什么样子吗?如果会,编译器会发现Wife类里面有一个对Husband的引用,但Husband目前正在被编译,都还没有确定下来,Husband想引用的类里面却开始引用Husband自己了,就是这一点我觉得怪怪的,可能因为我对java底层的编译原理不清楚造成的这个疑问,那么我是哪里理解错了呢,难道说java在编译一个类的时候,只要知道该类有个引用类型就行了,而不去管究竟引用的是怎样一个类,如果是这样,那么运行时,一个Husband实例的Wife属性又是怎样知道它应该指向一个Wife类型的实例呢?仅仅通过类的名称吗?
请指点.

解决方案 »

  1.   


    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> 
      <class name="couples.Husband" table="husband"> 
        <id name="id" type="java.lang.Long"> 
          <column name="id" /> 
          <generator class="identity" /> 
        </id> 
        <property name="name" type="java.lang.String"> 
          <column name="name" length="24" not-null="true"> 
            <comment>姓名</comment> 
          </column> 
        </property> 
            <one-to-one name="wife" cascade="all" /> 
      </class> 
    </hibernate-mapping>
      

  2.   

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> 
      <class name="couples.Wife" table="address" > 
        <id name="id" type="java.lang.Long"> 
          <column name="id" /> 
          <!-- class="foreign": 一对一主键映射中,使用另外一个相关联的对象的标识符 --> 
          <generator class="foreign"> 
            <param name="property">husband</param> 
          </generator> 
        </id> 
        <property name="name" type="java.lang.String"> 
          <column name="name" length="120" not-null="true"> 
            <comment>名字</comment> 
          </column> 
        </property> 
        <!-- 表示在address表存在一个外键约束,外键参考相关联的表person --> 
        <one-to-one name="husband" constrained="true" /> 
      </class> 
    </hibernate-mapping>
      

  3.   

    多谢以上两位的回复,但我想在想了解的是这两个类的编译原理,至于Hibernate的配置文件写法,我是知道的,谢谢
      

  4.   

    正因为编译器正在编译Husband类,所以在编译Wife的时候已经可以确认它是存在的。所以可以编译通过,实际上在生成的Class文件中,这个Husband成员变量就会有一个字符串来声明这个变量的类全名。不存在问题
      

  5.   

    Class中只需要记录引用到的类名、成员名称、方法签名(即参数与返回值信息),这个在编译Husband的时候已经会记录下来,所以当需要同时编译Wift时已经可以正确的找到
    因为Java不需要引用像类似偏移量的信息,所以互相引用是没有任何问题的。
      

  6.   

    我自己写了Husband 和 Wife 类 ,验证了ChDw说的是对的,感谢,这个问题我解决.