Eclipseelink JPA obtém erro ao inserir na tabela Derby com chave primária gerada

O EclipseLink parece estar passando incorretamente um valor de chave primária nula para o Derby ao persistir em uma tabela com chave primária gerada. Derby retorna erro deTentativa de modificar uma coluna de identidade nesse caso. O Derby precisa de uma instrução SQL que exclua o valor do id. Minha pergunta é como forçar o EclipseLink a enviar o SQL correto? Detalhes seguem ...

Estou usando o Eclipseelink para mapear para um banco de dados Derby (v10.8.1.2) sob o NetBeans 7.3beta2 mais recente.

A chave primária da tabela de banco de dados é gerada automaticamente:

CREATE TABLE STUDENT_BATCH ( 
    ID bigint PRIMARY KEY
        GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    FILENAME varchar(200) NOT NULL,
    SCHOOLBOARD varchar(100) NOT NULL,
    CREATE_TS timestamp NOT NULL,
    CONTACT_INFO varchar(200),
    NOTES varchar(2000),
    BOARD_NAME varchar(100)
)
;

A classe jpa correspondente especifica que o id é gerado usando a estratégia de identidade:

@Entity
@Table(name = "STUDENT_BATCH")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "StudentBatch.findAll", query = "SELECT s FROM StudentBatch s")})
public class StudentBatch implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
    @Basic(optional = false)
    @Column(name = "FILENAME")
    private String filename;
    @Basic(optional = false)
    @Column(name = "SCHOOLBOARD")
    private String schoolboard;
    @Basic(optional = false)
    @Column(name = "CREATE_TS")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTs;
    @Column(name = "CONTACT_INFO")
    private String contactInfo;
    @Column(name = "NOTES")
    private String notes;
    @Column(name = "BOARD_NAME")
    private String boardName;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "studentBatchId")
    private Collection<StudentRecord> studentRecordCollection;

    methods etc follow...

Quando vou persistir a classe, não especifico um id para que o Derby forneça o id.

                StudentBatch sb = new StudentBatch();
                sb.setBoardName(meta.get("BOARD NAME"));
                sb.setContactInfo(meta.get("CONTACT INFO"));
                sb.setCreateTs(new Date());
                sb.setFilename(event.getFile().getFileName());
                sb.setNotes(meta.get("NOTES"));
                sb.setSchoolboard(meta.get("SCHOOL BOARD"));
                _logger.debug("persisting batch");
                em.persist(sb);
                _logger.debug("flushing");
                em.flush();
                _logger.debug("flushed");

Eclipselink, no entanto, passa o id para derby como null e o Derby dá erroTentativa de modificar uma coluna de identidade:

INFO: DEBUG  11710 27 Nov 2012 18:17:10,558 [http-thread-pool-8080(4)] (FileUploadController.java:75) - persisting batch
INFO: DEBUG  11713 27 Nov 2012 18:17:10,561 [http-thread-pool-8080(4)] (FileUploadController.java:77) - flushing
WARNING: Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Attempt to modify an identity column 'ID'. 
Error Code: -1
Call: INSERT INTO STUDENT_BATCH (ID, BOARD_NAME, CONTACT_INFO, CREATE_TS, FILENAME, NOTES, SCHOOLBOARD) VALUES (?, ?, ?, ?, ?, ?, ?)
bind => [7 parameters bound]
Query: InsertObjectQuery(ca.ontario.mhltc.studentupload.model.StudentBatch[ id=null ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)

Isso faz algum sentido para mim desde que, se eu tentar executar uma inserção na linha de comando sql com o campo de id especificado eu recebo um erro também.

INSERT INTO STUDENT_BATCH (id, BOARD_NAME, CONTACT_INFO, CREATE_TS, FILENAME, NOTES, SCHOOLBOARD)
VALUES (null, 'abc', 'def', current_timestamp, 'aaa', 'aabb', '1234');

me dá isso:

Error code -1, SQL state 42Z23: Attempt to modify an identity column 'ID'. 
Line 1, column 1

Execution finished after 0 s, 1 error(s) occurred.

no entanto, esta instrução de inserção é bem-sucedida:

INSERT INTO STUDENT_BATCH (BOARD_NAME, CONTACT_INFO, CREATE_TS, FILENAME, NOTES, SCHOOLBOARD)
VALUES ('abc', 'def', current_timestamp, 'aaa', 'aabb', '1234');

devolve

Executed successfully in 0.002 s, 1 rows affected.
Line 1, column 1

Execution finished after 0.002 s, 0 error(s) occurred.

Parece-me que o Eclipseelink deve saber como o Derby manipula as colunas de identidade e não deve passar a coluna id na instrução insert. Existe uma solução para isso ou eu deveria apenas despejar Derby e usar algum outro banco de dados?

questionAnswers(1)

yourAnswerToTheQuestion