[ 
https://issues.apache.org/jira/browse/OPENJPA-2559?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14275228#comment-14275228
 ] 

Vermeulen edited comment on OPENJPA-2559 at 1/13/15 2:23 PM:
-------------------------------------------------------------

As mentioned on the openjpa-dev mailing list, @Column(nullable = false) is a 
hint for generating the database schema, not a hint for runtime checks. The 
exception should come from the database itself when it has the correct schema.

I still believe this is a bug because no PersistenceException is thrown at all 
when the entitymanager flushes changes to the database. Additionally, after 
this situation occurs, the resulting detached entity has a value for the column 
that is definitely not consistent with what is in the database. This can lead 
to unexpected problems in the application using OpenJPA for persistence.

I guess somehow the null value is skipped instead of issuing an update 
statement to the database to set the column to null.



was (Author: slowstrider):
As mentioned on the openjpa-dev mailing list, @Column(nullable = false) is a 
hint for generating the database schema, not a hint for runtime checks. The 
exception should come from the database itself when it has the correct schema.

I still believe this is a bug because no PersistenceException is thrown at all 
when the entitymanager flushes changes to the database.

I guess somehow the null value is skipped instead of issuing an update to set 
the column to null.


> OpenJPA silently ignores assigning a null value to a non-nullable column
> ------------------------------------------------------------------------
>
>                 Key: OPENJPA-2559
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2559
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.3.0
>            Reporter: Vermeulen
>         Attachments: NonNullable.java, NonNullableColumnTest.java
>
>
> OpenJPA should throw a PersistenceException when you merge an entity that has 
> null for a field that is mapped to a non-nullable column (@Column(nullable = 
> false)). This should also happen when you set the field to null for an 
> attached entity and then commit the change.
> This works fine for entities that haven't been persisted yet (INSERT). 
> However this does NOT happen for entities that are already persistent with a 
> non-null value for the field (UPDATE). When doing entityManager.merge, the 
> returned entity has null for the field, but the database still has the old 
> value. The entity returned by entityManager.find also returns this old 
> non-null value. Similarly, after setting the field to null on an attached 
> entity and committing the transaction it is still null in the entity, but not 
> in the database.
> This behavior makes it a lot harder to detect programming errors where you 
> accidentally attempt to update a non-nullable column to null, or where you 
> made a mistake in the mapping and actually expected the column to be 
> nullable. (Unless you also use the JSR 303 @NotNull annotation.)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to