Saturday, June 30, 2007

Updatable While New problem in JDeveloper 10.1.3

In my recent project I have faced an issue with editable table and validation functionality for table columns in JDeveloper 10.1.3. The problem was - when table was updated with wrong data, 500 Internal Server Error was generated, instead of error message. For sure, quite negative behavior. At first I have checked all validation rules, there was no any errors. For primary key attribute was assigned DBSequence type, I have tried to change it into oracle.jbo.domain.Number type, run test again - and application started to work correctly.

However, DBSequence type wasn't a source of problem. Problem was in Updatable While New option, when DBSequence type is used primary key attribute is read-only for existing rows, this means Updatable While New is selected automatically. Steve Muench have registered Updatable While New issue as a bug with reference - bug# 6138325, and provided workaround for us. Thanks Steve!

I have developed sample application - AttributeList.zip, in order to demonstrate this issue and to show how Steve's workaround works. In sample application EMPLOYEES table from standard HR schema is used. This table contains columns with NUMBER type, so it is suitable in our case. Sample provides two pages - test1.jspx and test2.jspx, first page shows wrong behaviour and second - correct.

At first, in JDeveloper 10.1.3 I have created simple editable table in standard way, like it is described in Oracle ADF Developer Guide. Table contains salary column, let's say we want to increase salary value for Alexander Hunold, column precision declared in database is 8, try to submit with precision 10:


Exception is generated:


Unusual behaviour, instead of validation error, exception is received and application crashed. However, workaround is available and in later JDeveloper versions this bug is fixed. Workaround is pretty simple and elegant, just put any updatable attribute in page definition file before read-only attribute for existing rows:


EmployeeId is declared as read-only attribute for existing rows:


And let's run a test again, correct behavior is received - no exception and expected validation message is shown:


Hope, shared experience will be useful for those, who will face the same issue in Oracle JDeveloper 10.1.3.

When running sample application, don't forget to add adf-faces-impl.jar and jsf-impl.jar to application's WEB-INF\lib directory.

No comments: