Hibernate - maneja add (insert) cuando fk se auto-referencia en otra clase

Tengo configuraciones de Hibernate de la siguiente manera.

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>

Seleccionar valores y actualizar funciona bien con esta configuración, pero insertar un valor completamente nuevo simplemente no lo hace.

Me sale este error:

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

Por lo tanto, Hibernate está intentando hacer una inserción sin obtener primero cpu_model_id del DB, y luego configurarlo para CPUModelSoftwarePK (consulte la configuración de CPUModel Hibernate)

Entonces, ¿cómo le digo a Hibernate que primero debe hacer una inserción en la tabla cpu_model. Luego obtenga la identificación desde allí y configure la identificación para CPUModelSoftwarePK y realice la inserción.

La base de datos para CPUModelSoftware / PK es la siguiente.

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

y para CPUModel

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

EDITAR

Parece que no estaba anulando CPUModelSoftwarePK al hacer un nuevo CPUModelSoftware. Sin embargo, ahora estoy obteniendo esto:

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

He estado buscando en Google / stackoverflow con varios términos, pero todos son demasiado amplios para identificar lo que estoy tratando de encontrar. Solo estoy mirando un código de API de AWS y quiero leer sobre cómo crear ...

Estoy leyendo la configuración de un archivo XML usando la configuración común de Apache. En una de las secciones, tengo varias líneas en forma de: <bla attr1 = "something" attr2 = "algo más" /> Idealmente, ...

Tengo un JTree que he configurado para que sea editable. Cuando hago triple clic en el nodo para editar el campo de texto subyacente, se dibuja pero el texto no está seleccionado y no es editable. La única forma en que yo ...

Usando AspectJ con enums obtengo los siguientes resultados: public enum EnumName {B, L, A} EnumName.class.isEnum (): true EnumName.class.getEnumConstants (): nulo Si no saludo (en tiempo de compilación) mi ...