> How does your original example of ManyToMany annotation on a Collection  
> of Enums actually work?  My understanding is that for ManyToMany both  
> sides must be persistent Entities.  So therefore the ManyToMany is  
> mapping the join table, not the Enum.

yes oddly enough it actually does work. As per my subsequent email, I 
switched it to @PersistentCollection and it performed the same way. I 
considered trying to annotate my Enum like an Entity but I figured that 
would be pushing expected behaviour... even if it worked, so I decided not 
to.


> Isn't the same thing true that OneToMany should annotate a Collection of  
> Entities?  So the Enums would be a field on the ManyToOne side of that  
> kind of mapping.  Then you can specify the @Column and @Enumerated  
> annotations on the actual field or property.

no you can't, I tried it. I can't remember the specific error but it was 
along the lines of  - you're not allowed to specify a column attribute 
here.

> Could you explain why using the @PersistentCollection annotation is  
> useful or necessary for OneToMany or ManyToMany collections generally or  
> specifically in the case you are looking at?  I don't understand the use  
> case that @PersistentCollection satisfies.

My understanding is @ManyToMany is a JPA standard and is only used to map 
entity to entities. 

My understanding of @PersistentCollection is that is is an OpenJpa 
extention which allows people to map Entity to java Primities.

i.e. 

@Entity
class Bar
{
}

@Entity
class Foo
{
   @ManyToMany
   HashSet<Bar> myBars=new HashSet<Bar>();

   @PersistentCollection
   HashSet<String> myStrings=new HashSet<String>();
}


I guess there's a reason why the original JPA standard left out 
primitives... it gets complicated fast.


> - Paul
>
>
> On 3/29/2009 8:43 PM, Tedman Leung wrote:
>> Just to document more thoughts and findings.
>>
>> 1) I was using the wrong annotation, I should have been using
>> @PersistentCollection
>>
>> 2) this seems to be a more wide spread problem with defining  
>> attributes to collections, i.e. - collection of enums needs to have 
>> @Enumerated configurations
>> - collection of Dates needs to have @Temporal configurations
>> - even collection of Strings seems to be missing a   
>> @Column(nullable=false, length=32) style annotation.
>>
>> I think the problem is much bigger and wide spread than I originaly though,
>> I don't think I'll be able to sort out a patch.
>>
>>
>> On Sun, Mar 29, 2009 at 07:55:06AM -0700, Tedman Leung wrote:
>>   
>>> yes I know I can do manual hacks to get them stored the way I want 
>>> to, but I was asking if there was a jpa / openjpa annotation to allow 
>>> that.
>>>
>>> As an example, I can just use @Enumerated on a single enum, so it 
>>> seems logical that some one would have thought about storing a 
>>> collection of enums. 
>>>
>>> As for why I want them as strings instead of ordinals - the usual 
>>> reasons, i.e. it's safer for changes as the ordering won't 
>>> accidentally corrupt my data (and without telling me), and it's 
>>> easier to look into the database via sql or something and just know 
>>> what's going on / get simple reports etc.
>>>
>>> I'm guessing right now that it's not possible at all and that no one 
>>> has done anything towards this. I might have to rummage through the 
>>> source and try to see if I can figure out how it works and hack a 
>>> patch to submit. It seemed like a very straight forward use case 
>>> though so I'm surprised no one has asked or done anything about this 
>>> before.
>>>
>>>
>>>
>>> On Sat, Mar 28, 2009 at 10:13:16PM -0700, Paul Copeland wrote:
>>>     
>>>> What is your objective?  Do you want some non-JPA application to 
>>>> see  them in the database as Strings?
>>>>
>>>> At some point you have add these Enums to the collection one at a 
>>>> time.   You can use an addEnum() method or an Entity listener to 
>>>> convert them to  Strings at that point one at a time. And a 
>>>> subclass of the Collection  type to getEnum() from the Collection 
>>>> when you fetch them back.
>>>>
>>>> new MyStringEnumHashSet<MyStringEnumType>()
>>>>
>>>> On 3/28/2009 9:27 PM, Tedman Leung wrote:
>>>>       
>>>>> No, I'm talking about when the enum is in a collection.
>>>>>
>>>>> i.e.
>>>>>
>>>>>    Private HashSet<Gender> genders=new HashSet<Gender>();
>>>>>
>>>>> So no, either the @Enumerated helps, nor does calling name() or  
>>>>> toString as neither are possible.
>>>>>
>>>>> I'm storing a Collection of enums , not a single Enum.
>>>>>
>>>>> There seems to be no examples of this nor any documentation about 
>>>>> the  ability to do this that I can find. The default seems to use 
>>>>> the ordinal value both for table generation and storage value.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Sat, Mar 28, 2009 at 01:56:13PM -0700, Paul Copeland wrote:
>>>>>           
>>>>>> Hi - This is from the OpenJPA relations example -
>>>>>>
>>>>>>    @Basic @Enumerated(EnumType.STRING)
>>>>>>    private Gender gender;
>>>>>>
>>>>>>    public static enum Gender { MALE, FEMALE }
>>>>>>
>>>>>>   public void setGender(Gender gender) {
>>>>>>        this.gender = gender;
>>>>>>   }
>>>>>>
>>>>>> See section 12.8.1.2 in the OpenJPA Overview
>>>>>>
>>>>>> - Paul
>>>>>>
>>>>>> On 3/28/2009 1:33 PM, catalina wei wrote:
>>>>>>               
>>>>>>> Ted,
>>>>>>> If you are using Java 5, then you could use name() or toString() API on 
>>>>>>> the
>>>>>>> Enum to get the name of the enum constant in String value.
>>>>>>>
>>>>>>> Catalina
>>>>>>>
>>>>>>> On Wed, Mar 25, 2009 at 9:48 AM, Tedman Leung <ted...@sfu.ca> wrote:
>>>>>>>
>>>>>>>                     
>>>>>>>> Anyone know how to store a collection of enums as Strings instead of 
>>>>>>>> their
>>>>>>>> ordinal values? (preferably with annotations...)
>>>>>>>>
>>>>>>>> i.e.
>>>>>>>>        @ManyToMany
>>>>>>>>        private Set<MyEnum> myEnums=new HashSet<MyEnum>();
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>>                                                           Ted Leung
>>>>>>>>                                                           ted...@sfu.ca
>>>>>>>>
>>>>>>>> It's time for a new bike when the bulb in your shift light burns out.
>>>>>>>>
>>>>>>>>                           
>>>>>>>                     
>>>>>           
>>> -- 
>>>                                                            Ted Leung
>>>                                                            ted...@sfu.ca
>>>
>>> The most important words I've learned to say - "I don't know".
>>>     
>>
>>   
>

-- 
                                                           Ted Leung
                                                           ted...@sfu.ca

It's time for a new bike when the bulb in your shift light burns out.

Reply via email to