我有两张桌子:
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。可能导致这种情况的原因是什么?
答案 0 :(得分:1)
不幸的是,评论有点长,但希望这会给你一些看法:
我的理解是NHibernate
实际上是“默认懒惰”,这意味着Address
对象在被请求之前不会被填充,然后(如果我没记错的话)只有你仍然连接。我过去曾经遇到过将部分加载的对象传递到我的view
项目中的MVC
并且你的声音相似的问题。
话虽这么说,我已经阅读了几篇文章,你NHibernate
并没有为many-to-one
关系延迟加载,但我仍然认为这可能值得研究。 many-to-one
关系需要使用外键,因此引用列必须是主键。即EMPLOYEE.address = ADDRESS.id
。
一旦你解决了问题,请发布实际上错误的内容,因为我希望在NHibernate
中提高我的知识。
您可能会发现以下文章有用:
这些问题: