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

Kevin Sutter commented on OPENJPA-272:
--------------------------------------

I just committed the changes to resolve this issue.  Per the discussion on our 
dev mailing list 
(http://www.nabble.com/Allow-overrides-of-%40GeneratedValue--tf4031013.html#a11450606),
 I decided to go with the more direct response as Patrick and others suggested. 
 That is, if somebody has @GeneratedValue on a field (id or otherwise) and then 
attempts to set a value either via an initializer or a setter method, then an 
InvalidStateException will be thrown.  This will immediately let the user know 
that something isn't quite right.  At first, I thought this was too drastic and 
was leaning towards a warning or error message.  But, due to data integrity 
concerns, I decided to go with an exception to signal the problem.  This will 
force the user to do something about the situation instead of blindly running 
with it until s/he notices the error message.

The exception thrown has a localizer message that indicates the problem and 
suggested actions to resolve it.

I also provided a new testcase to test for this new condition and the exception 
processing.

I also had to update the TestSharedMappedSuperclassIdValue testcase since it 
was incorrectly relying on this "incorrect" behavior.

Kevin

> @GenerateValue (AUTO) doesn't work with Property level access
> -------------------------------------------------------------
>
>                 Key: OPENJPA-272
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-272
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 0.9.7
>            Reporter: Kevin Sutter
>            Assignee: Kevin Sutter
>             Fix For: 1.0.0
>
>
> The @GenerateValue annotation doesn't work correctly when applied to via the 
> Property level access (getter method) when using the wrapper classes for the 
> primitive types.  Something like this:
>     private Long id;
>     @Id
>     @GeneratedValue(strategy=GenerationType.AUTO)
>       public Long getId() {
>               return id;
>       }
>       public void setId(Long id) {
>               this.id = id;
>       }
> With this type of Entity definition, we hit a problem when checking for the 
> "default value":
>     public boolean isDefaultValue() {
>         return dblval == 0 && longval == 0
>             && (objval == null || "".equals(objval));
>     }
> For this scenario, objval is not null and it's not of type String, so we fail 
> this test and return false.  Upon returning the value of false, the calling 
> code skips the call that would have assigned the generated value to the field 
> (in ApplicationIds):
>     private static boolean assign(OpenJPAStateManager sm, StoreManager store,
>         FieldMetaData[] pks, boolean preFlush) {
>         for (int i = 0; i < pks.length; i++)
>             if (pks[i].getValueStrategy() != ValueStrategies.NONE
>                 && sm.isDefaultValue(pks[i].getIndex())
>                 && !store.assignField(sm, pks[i].getIndex(), preFlush))
>                 return false;
>         return true;
>     }
> I haven't figured out the exact fix yet, but there are two workarounds 
> available:
> 1.  Use field level annotations instead of property, or...
> 2.  Don't use the primitive wrapper types (use long instead of Long).
> In either of these cases, objval is left as null and we are eventually 
> allowed to call store.assignField() which gets the generated value assigned 
> to the field in question (id in this case).
> I will keep digging, but if anyone knows the history of the isDefaultValue() 
> method, it would help with getting a quick answer to this Issue.  Since we're 
> dealing with generated values, I'm not clear why we care if values are 
> already assigned to this field or not.  It would seem that we would want to 
> just override what's there.  But, like I said, I need to dive into this a 
> bit.  I just wanted to get the Issue on the books with the information I 
> discovered thus far.
> Kevin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to