Hibernate - обрабатывать добавление (вставку) при самостоятельной ссылке fk в другом классе - PullRequest
1 голос
/ 24 мая 2011

У меня есть Hibernate-конфигурации следующим образом.

CPUModel :

<?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="org.example.CPUModel" table="cpu_model">
    <id name="cpuModelId" type="java.lang.Integer" unsaved-value="null">
      <column name="cpu_model_id"/>
      <generator class="identity"/>
    </id>
    <property name="name" type="java.lang.String">
      <column length="32" name="name"/>
    </property>
    <set name="softwares" inverse="true" lazy="false" table="cpu_model_software" cascade="all-delete-orphan" order-by="cpu_sw_id desc">
      <key>
        <column name="cpu_model_id" not-null="true"/>
      </key>
      <one-to-many class="org.example.CPUModelSoftware"/>
    </set>
  </class>
</hibernate-mapping>

CPUModelSoftware

<?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="org.example.CPUModelSoftware" table="cpu_model_software">
    <composite-id name="cpuModelSoftwarePK" class="org.example.CPUModelSoftwarePK">
      <key-property name="cpuModelId" column="cpu_model_id" type="java.lang.Integer"/>
      <key-property name="cpuSwId" column="cpu_sw_id" type="java.lang.Integer"/>
    </composite-id>
    <many-to-one class="org.example.CPUSoftware" insert="false" update="false" fetch="select" name="cpuSw">
      <column name="cpu_sw_id" not-null="true"/>
    </many-to-one>
  </class>
</hibernate-mapping>

ВыборЗначения и обновление работают нормально с этим конфигом, но вставка совершенно нового значения просто не дает.

Я получаю эту ошибку:

DEBUG Could not execute JDBC batch update [insert into exampledb.cpu_model_software (cpu_model_id, cpu_sw_id) values (?, ?)]
java.sql.BatchUpdateException: Column 'cpu_model_id' cannot be null

Итак, Hibernate пытается вставить без первогополучение сгенерированного cpu_model_id из БД и установка его затем для CPUModelSoftwarePK (см. конфигурацию CPUModel Hibernate)

Итак, как мне сообщить Hibernate, что он должен сначала выполнить вставку в таблицу cpu_model.Затем получите идентификатор оттуда и установите идентификатор для CPUModelSoftwarePK и сделайте вставку?

ДБ для CPUModelSoftware / PK выглядит следующим образом.

+----------------+---------+------+-----+---------+-------+
| Field          | Type    | Null | Key | Default | Extra |
+----------------+---------+------+-----+---------+-------+
| cpu_model_id   | int(11) | NO   | MUL | NULL    |       |
| cpu_sw_id      | int(11) | NO   | MUL | NULL    |       |
+----------------+---------+------+-----+---------+-------+

и для CPUModel

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| cpu_model_id   | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(32)      | NO   |     |         |                |
+----------------+------------------+------+-----+---------+----------------+

РЕДАКТИРОВАТЬ

Кажется, я не обнулял CPUModelSoftwarePK при создании нового CPUModelSoftware.Однако теперь я получаю это:

ids for this class must be manually assigned before calling save(): org.example.CPUModelSoftware

1 Ответ

1 голос
/ 24 мая 2011

Насколько я понимаю, Hibernate не поддерживает производные идентификаторы в отображениях, определенных в hbm.xml.Это означает, что Hibernate не может установить значение cpuModelId автоматически на основе отношения между CPUModel и CPUModelSoftware.

Таким образом, вам необходимо сначала сохранить CPUModel (с пустым softwares),затем вам нужно присвоить его сгенерированный идентификатор полю составного идентификатора CPUModelSoftware и сохранить CPUModelSoftware.

...