Hibernate - Dúvida sobre o CASCADE

Pessoal,

Estou fazendo um programa, onde um curso tem varias disciplinas, logo, quando eu inserir um curso no banco de dados (através do Hibernate) quero que seja inserido também todas as disciplinas dentro dele, para isso setei o cascade=“save-update” do one-to-many, porem me dá o seguinte erro.

[color=red]log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: /* insert hibernate.Curso / insert into Curso (nome, descricao, id) values (?, ?, ?)
Hibernate: /
insert hibernate.Disciplina / insert into Disciplina (nome, ementa, Curso_id, id) values (?, ?, ?, ?)
Hibernate: /
insert hibernate.Disciplina / insert into Disciplina (nome, ementa, Curso_id, id) values (?, ?, ?, ?)
Hibernate: /
insert hibernate.Disciplina / insert into Disciplina (nome, ementa, Curso_id, id) values (?, ?, ?, ?)
Initializing c3p0 pool… com.mchange.v2.c3p0.PoolBackedDataSource@15e83f9 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@910040 [ acquireIncrement -> 2, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, idleConnectionTestPeriod -> 3000, initialPoolSize -> 2, maxIdleTime -> 5000, maxPoolSize -> 10, maxStatements -> 10, maxStatementsPerConnection -> 0, minPoolSize -> 2, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@12d3205 [ description -> null, driverClass -> null, factoryClassLocation -> null, jdbcUrl -> jdbc:mysql://localhost/hibernate?autoReconnect=true, properties -> {user=
*****, password=******} ] , preferredTestQuery -> null, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, usesTraditionalReflectiveProxies -> false ] , factoryClassLocation -> null, numHelperThreads -> 3, poolOwnerIdentityToken -> 15e83f9 ]
Exception in thread “main” org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:80)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:181)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at Hibernate.main(Hibernate.java:91)
Caused by: java.sql.BatchUpdateException: Column ‘nome’ cannot be null
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:652)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1722)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
… 8 more
Java Result: 1[/color]

Meu codigo no main:

[code]// Curso e suas disciplinas
Disciplina D1 = new Disciplina();
D1.setNome(“Matemática”);
D1.setEmenta(“123456789”);

    Disciplina D2 = new Disciplina();
    D1.setNome("Português");
    D1.setEmenta("123456789");
    
    Disciplina D3 = new Disciplina();
    D1.setNome("Física");
    D1.setEmenta("123456789");
    
    Curso curso = new Curso();
    curso.setNome("Supletivo");
    curso.setDescricao("Descrição da disciplina em questão.");

    D1.setCurso(curso);
    D2.setCurso(curso);
    D3.setCurso(curso); 
    curso.getDisciplinas().add(D1);
    curso.getDisciplinas().add(D2);
    curso.getDisciplinas().add(D3);

    sessao.save(curso);[/code]

E o meu Curso.hbm.xml, vejam se setei da forma correta o cascade:

[code]<?xml version="1.0" encoding="UTF-8"?>

    <id name="id">
        <generator class="increment"/>
    </id>

    <property name="nome"/>
    <property name="descricao"/>
    
    <set name="disciplinas" inverse="true" cascade="save-update">
        <key column="Curso_id"/>
        <one-to-many class="hibernate.Disciplina"/>
    </set>
   
</class>

[/code]

Agradeço desde já toda ajuda possível.
Abraços.

O erro está no stacktrace. Uma coluna chamada nome não está preenchida.

Caused by: java.sql.BatchUpdateException: Column 'nome' cannot be null at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:652) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1722) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)

Edit: Verifique o mapeando da outra entidade e tente salvar uma por uma e depois com o cascade.

Ola a todos,

Além do que o lsjunior disse, tente setar o cascade como ALL. Ao que parece o sistema não precisa manter as diciplinas sem um curso.

Att.

Oi lsjunior,

Então, o problema é que se eu for slvar uma a uma funciona, no final ele adiciona tudo, é só quando eu uso o cascade no Curso que acontece esse problema. Também já usei o Cascade.ALL e nada, mesma coisa.

O mais estranho é que se for reparar ele forma as querys certinhas lá em cima do erro, mas não consegue adiciona-las, porem uma a uma vai. Estranho, não?

Pessoal, já descobri o problema, olha só que burrice a minha, estava aqui:

[code]// Curso e suas disciplinas
Disciplina D1 = new Disciplina();
D1.setNome(“Matemática”);
D1.setEmenta(“123456789”);

    Disciplina D2 = new Disciplina();
    D2.setNome("Português");
    D2.setEmenta("123456789");
    
    Disciplina D3 = new Disciplina();
    D3.setNome("Física");
    D3.setEmenta("123456789");[/code]

Vejam que lá no meu primeiro post que eu estava setando as propriedades de D1 apenas, e não D2 e D3, logo por isso que dizia que o nome tava null. Burrice, eu sei! Mas mesmo assim obrigado a todos.