孩子们没有被存放

时间:2015-10-19 06:11:24

标签: hibernate spring-mvc

我正在用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...

所以,如果有人可以帮助我,我会非常感激

2 个答案:

答案 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">

删除它,足以解决问题