小弟刚学到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类型的实例呢?仅仅通过类的名称吗?
请指点.
很多教程对一对一的关系映射都会举以下两个类为例
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类型的实例呢?仅仅通过类的名称吗?
请指点.
<?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>
<!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>
因为Java不需要引用像类似偏移量的信息,所以互相引用是没有任何问题的。