我有多对一的关系,当我尝试插入一个值时,没有传递前键。hibernate 在生成的 SQL 查询中不包含它的值。
City 和 LocalizedLocation 实体的定义:
<!-- LocalizedLocation -->
<hibernate-mapping>
<class name="servicedb.dal.domain.LocalizedLocation" table="localized_location" catalog="DB">
<composite-id name="id" class="servicedb.dal.domain.LocalizedLocationId">
<key-property name="localeId" type="int">
<column name="locale_id" />
</key-property>
<key-property name="locationId" type="int">
<column name="location_id" />
</key-property>
</composite-id>
<many-to-one name="location" class="servicedbcedb.dal.domain.Location" update="false" insert="false" fetch="select">
<column name="location_id" not-null="true" />
</many-to-one>
<many-to-one name="city" class="servicedb.dal.domain.City" update="false" insert="false" fetch="select" cascade="all">
<column name="locale_id" not-null="true" />
<column name="country_code" length="2" not-null="true" />
<column name="city_id" not-null="true" />
</many-to-one>
<property name="title" type="string">
<column name="title" length="120" />
</property>
</class>
</hibernate-mapping>
<!-- City -->
<hibernate-mapping>
<class name="servicedb.dal.domain.City" table="city" catalog="DB">
<composite-id name="id" class="servicedb.dal.domain.CityId">
<key-property name="localeId" type="int">
<column name="locale_id" />
</key-property>
<key-property name="countryCode" type="string">
<column name="country_code" length="2" />
</key-property>
<key-property name="id" type="int">
<column name="id" />
</key-property>
</composite-id>
<property name="name" type="string">
<column name="name" length="100" not-null="true" />
</property>
<set name="localizedLocations" table="localized_location" inverse="true" lazy="true" fetch="select">
<key>
<column name="locale_id" not-null="true" />
<column name="country_code" length="2" not-null="true" />
<column name="city_id" not-null="true" />
</key>
<one-to-many class="servicedb.dal.domain.LocalizedLocation" />
</set>
</class>
</hibernate-mapping>
下面的代码应该插入 Location,然后是 LocalizedLocation,LocalizedLocation 应该有指向插入位置的外键,但由于某种原因它没有。
Session session = locationDAO.getSession();
session.beginTransaction();
// Location inititalization, the object is correctly populated
session.save(location);
LocalizedLocation localizedLocation = new LocalizedLocation();
localizedLocation.setId(new LocalizedLocationId(locale.getId(), location.getId()));
localizedLocation.setCity(city); // the city already exists on the database, object is not null
localizedLocation.setLocale(locale); // the locale already exusts on the database
localizedLocation.setLocation(location);
session.save(localizedLocation);
session.getTransaction().commit();
提交后,生成的插入查询如下:
insert into DB.localized_location (title, description, locale_id, location_id) values (?, ?, ?, ?)
但它应该是:
insert into DB.localized_location (title, description, locale_id, location_id, city_id, country_code) values (?, ?, ?, ?, ?, ?)
有人知道为什么生成的 sql 插入语句中不包含 city 表的外键吗?
我还使用 eclipse 和 reveng.xml 对数据库进行逆向工程,所以我的 hbm 文件是自动生成的,我没有使用 EJB3 注释。