Java Hibernate-在另一个类中fk自引用时处理添加(插入)
我有如下Hibernate配置Java Hibernate-在另一个类中fk自引用时处理添加(插入),java,hibernate,foreign-keys,one-to-many,Java,Hibernate,Foreign Keys,One To Many,我有如下Hibernate配置 +----------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------+------+-----+---------+-------+ | cpu_model_id | int(11) | NO | MUL | NULL |
+----------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------+------+-----+---------+-------+
| cpu_model_id | int(11) | NO | MUL | NULL | |
| cpu_sw_id | int(11) | NO | MUL | NULL | |
+----------------+---------+------+-----+---------+-------+
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>
因此,Hibernate试图在不首先从DB获取生成的cpu模型id,然后为CPUModelSoftwarePK设置的情况下进行插入(请参阅CPUModel Hibernate配置)
那个么,我如何告诉Hibernate它应该首先向cpu\ U模型表进行插入呢。然后从那里获取id,设置CPUModelSoftwarePK的id并进行插入
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软件时,我似乎没有取消CPUModelSoftwarePK。然而,现在我得到了这个:
ids for this class must be manually assigned before calling save(): org.example.CPUModelSoftware
据我所知,Hibernate不支持
hbm.xml
中定义的映射中的派生标识。这意味着Hibernate无法根据CPUModel
和CPUModel软件之间的关系自动设置CPUModel
的值
因此,您需要先保存CPUModel
(使用空的软件
),然后需要将其生成的标识符分配给CPUModelSoftware
的compisite id字段,并保存CPUModelSoftware
,据我所知,Hibernate不支持hbm.xml
中定义的映射中的派生标识。这意味着Hibernate无法根据CPUModel
和CPUModel软件之间的关系自动设置CPUModel
的值
因此,您需要先保存CPUModel
(使用空的软件
),然后需要将其生成的标识符分配给CPUModelSoftware
的compisite id字段,并保存CPUModelSoftware
try
try
是这样的。我必须首先保存CPUModel对象,而不必引用CPUModel软件。之后,只需使用CPUModelSoftware引用再次保存。不知何故,我认为Hibernate可以自动完成这项工作,但这个世界并不完美。:-)谢谢是的,就是这样。我必须首先保存CPUModel对象,而不必引用CPUModel软件。之后,只需使用CPUModelSoftware引用再次保存。不知何故,我认为Hibernate可以自动完成这项工作,但这个世界并不完美。:-)谢谢
ids for this class must be manually assigned before calling save(): org.example.CPUModelSoftware