我正在用Hibernate制作一个小项目,我遇到了一个无法找到解决方案的问题:
我有一个表呼叫Solicitud(“父亲”),它由另一个表DetalleSolicitud(孩子们)的几个记录组成,你可以回想起以前的“模型”,就像一个账单及其销售细节。
当我试图保存“父亲”时,hibernate没有保存它的儿子。
看到hibernate生成的sql语句我发现没有存储将子连接到父的列:
filter('cmdate', [
'$filter', function($filter) {
return function(input, format) {
//console.log(input);
//console.log(format);
if (input !== null) {
//breaks DB date to array
var parts = input.split(/[-]/).filter(function(str) {
return str !== '';
});
//Takes date with time and returns array with date at 0th position
var date = parts[2].split(/[ ]/).filter(function(str) {
return str !== '';
});
}
var finalDate = date[0] + '/' + parts[1] + '/' + parts[0];
return finalDate;
};
}
])
正如您所看到的,IDSOLICITUD列不是用于向DETALLESOLICITUD添加新记录的sql语句的一部分,因为这是连接父子的列。我不知道为什么会这样,因为我认为我的映射文件是错误的,但它们似乎没问题:
solicitud.hbm.xml
Hibernate: insert into SOLICITUD (ESTADO, TIPOSOLICITUD, IDUSUARIO, IDSOLICITUD) values (?, ?, ?, ?)
Hibernate: insert into DETALLESOLICITUD (IDLAB, IDDIA, IDBLOQUE, IDDETALLE) values (?, ?, ?, ?)
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1400, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-01400: cannot insert NULL into ("TOO"."DETALLESOLICITUD"."IDSOLICITUD")
detallesolicitud.hbm.xml
<class name="Solicitud" table="SOLICITUD">
<id name="id" column="IDSOLICITUD">
<generator class="sequence">
<param name="sequence">SOLICITUD_SEQ</param>
</generator>
</id>
<property name="estado" column="ESTADO"/>
<property name="tipo" column="TIPOSOLICITUD"/>
<many-to-one name="usuario_solicitante" class="Usuario">
<column name="IDUSUARIO" not-null="true"></column>
</many-to-one>
<set name="detallesSolicitud" cascade="save-update" table="DETALLESOLICITUD">
<key>
<column name="IDSOLICITUD" not-null="true"/>
</key>
<one-to-many class="DetalleSolicitud" />
</set>
... Lots of other attributes...
所以,如果有人可以帮助我,我会非常感激
答案 0 :(得分:0)
可能有两种方式 -
从solicitud.hbm.xml中删除not-null
<set name="detallesSolicitud" cascade="save-update" table="DETALLESOLICITUD">
<key>
<column name="IDSOLICITUD"/>
</key>
<one-to-many class="DetalleSolicitud" />
</set>
和我相信的其他人
你应该保存父亲并刷新会话然后保存孩子,因为它将没有空值#34; TOO&#34;。&#34; DETALLESOLICITUD&#34;。&#34; IDSOLICITUD& #34;来自父亲。
同时确保序列&#34; SOLICITUD_SEQ&#34;已存在于数据库中。
希望这会有所帮助。感谢
答案 1 :(得分:0)
好吧,我终于找到了解决这个问题的方法:似乎我对一对多映射标记有错误的引用。
问题是属性
table="DETALLESOLICITUD"
在
行<set name="detallesSolicitud" cascade="save-update" table="DETALLESOLICITUD">
删除它,足以解决问题