[regression] unable to persist entity using derby 10.6.1.0 and hibernate 3.5+

Description

when inserting any kind of entity

@Entity
public class TestObject
{
private Long id;

private String test;

public TestObject(){}

@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
[...]

i get the following error message

org.hibernate.exception.ConstraintViolationException: could not insert: [com.mypackage.TestObject]
>>java.sql.SQLIntegrityConstraintViolationException: Column 'ID' cannot accept a NULL value.
>>org.apache.derby.impl.jdbc.EmbedSQLException: Column 'ID' cannot accept a NULL value.
>>ERROR 23502: Column 'ID' cannot accept a NULL value.
>> at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
>> at org.apache.derby.impl.sql.execute.NormalizeResultSet.normalizeColumn(Unknown Source)
>> at org.apache.derby.impl.sql.execute.NormalizeResultSet.normalizeRow(Unknown Source)
>> at org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown Source)
>> at org.apache.derby.impl.sql.execute.DMLWriteResultSet.getNextRowCore(Unknown Source)
>>...

the same code is working fine with versions 3.3.2GA and annotations 3.4.0GA and earlier. i just switched back...

Activity

Show:

Brett MeyerMarch 7, 2014 at 5:31 PM

Bulk closing rejected tickets in "resolved" state.

Former userFebruary 23, 2012 at 2:17 AM

Fabien Marsaud, thanks for your explanation and workaround.

Fabien MarsaudFebruary 22, 2012 at 4:27 AM
Edited

I believe this issue is not a regression and that it can be closed: Hibernate now simply abides by http://db.apache.org/derby/docs/10.6/ref/rrefsqlj37836.html ID generation.

Let's assume your entities are declared with:
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() { return id; }

At the time of Hibernate 3.3, if your DB was created using the output of configuration.generateSchemaCreationScript(new DerbyDialect()), you must have got some HIBERNATE_UNIQUE_KEY table which acted as a sequence for Hibernate to fill entities' IDs before INSERT. With Hibernate 3.5+ the DDL statements would contain "generated by default as identity" next to each PK declaration.

In other words, now, Hibernate has a good reason not to fill the ID of entities to be inserted: it considers Derby should manage them instead. If you want to keep your Derby IDs as they were (without generated identity), just fill the ID column yourself before INSERT. We could have the same discussion with non-autoincremented MySQL tables PKs.

To fix, you may want to export data, drop contraints+tables, regenerate creation script, check it contains "generated always/by default as identity", create tables, re-insert data, restore constraints, enjoy.

Former userApril 2, 2011 at 7:44 AM

I tried with Derby 10.5.3.0_1 on a whim but as expected the problem still exists - it's a Hibernate issue.

I found an interesting thread while searching earlier, particularly the following message and a number of its follow ups, as these guys basically debugged the Hibernate problem (read about 10-15 messages from this one; you may benefit from reading some of its preceding messages too):
http://www.mail-archive.com/dhis2-devs@lists.launchpad.net/msg00546.html

They made a new dialect to solve: org.hisp.dhis.dialect.IdentityDerbyDialect

Any committers interested in fixing this one soon? We have a couple of environments/databases and prefer not using the table generation type for all (one build for all deploys).

Max GiesbertNovember 2, 2010 at 8:17 PM

Just rechecked with Derby 10.6.2.1 and Hibernate 3.6.0 final. Problem still exists. Work-around is to set GenerationType to TABLE.

Rejected

Details

Assignee

Reporter

Components

Affects versions

Priority

Created July 30, 2010 at 8:30 PM
Updated March 7, 2014 at 5:31 PM
Resolved February 23, 2012 at 2:17 AM