简体   繁体   中英

Hibernate not setting foreign key on insert

I have Many-to-one relationship and when I'm trying to insert a value, the foreigh key is not passed. The hibernate doesn't include it's values in the generated SQL query.

Definition of City and LocalizedLocation entities:

<!-- 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>

The following code should insert Location and then LocalizedLocation, the LocalizedLocation should have the foreign key pointing to the inserted Location, but for some reason it doesn't.

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();

After the commit, the generated insert query is the following:

insert into DB.localized_location (title, description, locale_id, location_id)  values (?, ?, ?, ?)

But it should be:

insert into DB.localized_location (title, description, locale_id, location_id, city_id, country_code)  values (?, ?, ?, ?, ?, ?)

Does anybody know why the foreign key to the city table is not included in the generated sql insert statement?

I'm also using the eclipse and reveng.xml to reverse engineer the database, so my hbm files are auto generated and I'm not using EJB3 annotations.

Your city property in LocalizedLocation mapping seems to have "insert=false" and "update=false". Mapped this way, it makes this an "inverse" relationship, in which the connection is only saved from the other side - ie while saving the Location.

Either remove those two attributes, or save the city after setting up the relationship on its side.

Edit : corrected the property.

BTW, in case the city does not map a list of LocalizedLocations - as i somehow got this idea from your description - it does not seem to make sense to have those two properties at false since the only way to insert that relationship would be mapping another property on the same column (or doing it directly on the db).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM