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

Patrick Linskey commented on OPENJPA-272:
-----------------------------------------

Man. Another place where property access rules are annoying.

It seems like one possible solution would be to just expand what is considered 
a default value to include auto-boxed values, when running in a JDK1.5 or 
higher environment.

> @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