У меня есть 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