未设置Hibernate 1对1映射列

时间:2014-07-23 20:58:29

标签: java sql hibernate

我有两张桌子:

create table EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   address    INT NOT NULL,
   PRIMARY KEY (id)
);

create table ADDRESS (
   id INT NOT NULL auto_increment,
   street_name VARCHAR(40) default NULL,
   city_name VARCHAR(40) default NULL,
   state_name VARCHAR(40) default NULL,
   zipcode VARCHAR(10) default NULL,
   PRIMARY KEY (id)
);

其中EMPLOYEE.address是映射到ADDRESS

的外键

我的映射文件定义如下:

<hibernate-mapping>
   <class name="Employee" table="EMPLOYEE">
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
      <many-to-one name="address" column="address" unique="true" 
       class="Address" not-null="true"/>
   </class>

   <class name="Address" table="ADDRESS">
      <meta attribute="class-description">
         This class contains the address detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <property name="street" column="street_name" type="string"/>
      <property name="city" column="city_name" type="string"/>
      <property name="state" column="state_name" type="string"/>
      <property name="zipcode" column="zipcode" type="string"/>
   </class>

</hibernate-mapping>

但是,当我拉Employee个对象时,所有正常字段都会正常填充,除了Address普通旧对象中的Employee字段,所有值都设置为null。可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

不幸的是,评论有点长,但希望这会给你一些看法:

我的理解是NHibernate实际上是“默认懒惰”,这意味着Address对象在被请求之前不会被填充,然后(如果我没记错的话)只有你仍然连接。我过去曾经遇到过将部分加载的对象传递到我的view项目中的MVC并且你的声音相似的问题。

话虽这么说,我已经阅读了几篇文章,你NHibernate并没有为many-to-one关系延迟加载,但我仍然认为这可能值得研究。 many-to-one关系需要使用外键,因此引用列必须是主键。即EMPLOYEE.address = ADDRESS.id

一旦你解决了问题,请发布实际上错误的内容,因为我希望在NHibernate中提高我的知识。

您可能会发现以下文章有用:

这些问题: