openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Geir Magnusson Jr." <g...@pobox.com>
Subject Re: Problem with @ManyToOne and @JoinTable
Date Tue, 06 Nov 2007 00:32:07 GMT
To review, I have three tables :

Show, InputFile and a join table, Show2InputFile.

Show happens to be a subclass of InventoryItem using JOINED  
inheritance strategy.  Not sure if that matters.  (I've seen some  
weird behavior w/ Hibernate w/ JOINED, so I'm suspicious of it for no  
rational reason)

Show has a PK "id", as does InputFile.

Show2InputFile looks like :

+-------------+------------------+------+-----+---------+-------+
| Field       | Type             | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+-------+
| showId      | int(11) unsigned | NO   | PRI |         |       |
| inputFileId | int(11) unsigned | NO   | PRI |         |       |
+-------------+------------------+------+-----+---------+-------+

I believe it's unidirectional ManyToOne (if that's legal).  Each  
InputFile is associated with one Show and one Show only, but multiple  
InputFiles can be associated to the same Show.

Currently I have in InputFile :

     @ManyToOne
     @JoinTable(name="Show2InputFile",
             joinColumns = @JoinColumn(name="inputFileId"),
             inverseJoinColumns = @JoinColumn(name="showId"))
     public Show getShow() {
         return show;
     }

and while Hibernate thinks that's just peachy, OpenJPA 1.0.0 gags on  
it with

Caused by: <openjpa-1.1.0-SNAPSHOT-r420667:588533 fatal user error>  
org.apache.openjpa.persistence.ArgumentException: You have supplied  
columns for "com.joost.model.logistics.InputFile.show<element:class  
java.lang.Object>", but this mapping cannot have columns in this  
context.

Now, while I don't want to add anything to the Show class, since this  
really is unidirectional, I did add :

     @OneToMany
     @JoinTable(name="Show2InputFile",
              inverseJoinColumns = @JoinColumn(name="inputFileId"),
               joinColumns = @JoinColumn(name="showId"))
     public Set<InputFile> getInputFiles(){
         return null;
     }

     public void setInputFiles(Set<InputFile> list) {
         //noop
     }

just to see if that would make OpenJPA happy, but as far as I can  
see, it doesn't.  I believe I get the same error message.

I really want to switch to OpenJPA, but this is stopping me.   Does  
anyone have any idea what I'm doing wrong?

geir


On Nov 5, 2007, at 3:05 PM, Patrick Linskey wrote:

> Where are the foreign keys?
>
> Bear in mind that @OneToOne, @OneToMany, @ManyToMany, and @ManyToOne
> are JPA annotations, not ER annotations. The concepts differ a bit.
>
> -Patrick
>
> On Nov 5, 2007 11:33 AM, Geir Magnusson Jr. <geir@pobox.com> wrote:
>>
>> On Nov 5, 2007, at 2:07 PM, Patrick Linskey wrote:
>>
>>>>> What happens if you just use a @OneToOne instead of the  
>>>>> @ManyToOne?
>>>>
>>>> The problem is that it's not OneToOne
>>>
>>> Can you describe this in more detail? (I.e., in terms of what your
>>> schema looks like.)
>>>
>>
>> Well, there's a Show table, w/ a pk, and the Show class really has no
>> interest in the InputFile class.
>>
>> There's an inputfile table, w/ a pk.  The InputFile class does have a
>> ManyToOne with Show :
>>
>> In real world problem, each Show we have on the platform is a
>> singleton ("I dream of Genie Epsode 11"), but a content owner may
>> give us updated source material - say they have a new transcoding.
>> We want to add a new InputFile into the database, point it at the
>> Show, but the Show itself doesn't care about it's source.
>>
>> Does that help?
>>
>> eir
>>
>>
>>
>>> -Patrick
>>>
>>> On Nov 5, 2007 10:40 AM, Geir Magnusson Jr. <geir@pobox.com> wrote:
>>>>
>>>> On Nov 5, 2007, at 12:44 PM, Patrick Linskey wrote:
>>>>
>>>>>> I'm a newbie, so I don't quite grok the question.  Show itself
>>>>>> doesn't have any references to InputFile.
>>>>>
>>>>> Aha! IIRC, @ManyToOne is only meaningful when used as the back
>>>>> side of
>>>>> a @OneToMany.
>>>>
>>>> We don't have that.  There are reasons, and its intentional.
>>>>
>>>>>
>>>>> What happens if you just use a @OneToOne instead of the  
>>>>> @ManyToOne?
>>>>
>>>> The problem is that it's not OneToOne
>>>>
>>>>
>>>>>
>>>>> -Patrick
>>>>>
>>>>> On Nov 5, 2007 9:16 AM, Geir Magnusson Jr. <geir@pobox.com> wrote:
>>>>>>
>>>>>> On Nov 5, 2007, at 11:48 AM, Patrick Linskey wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> What does the other side of the relation look like?
>>>>>>
>>>>>> I'm a newbie, so I don't quite grok the question.  Show itself
>>>>>> doesn't have any references to InputFile.
>>>>>>
>>>>>>> Also, what does
>>>>>>> the Show class look like?
>>>>>>
>>>>>> in what way?  Show is a subclass in a JOINED inheritance
>>>>>> strategy, if
>>>>>> that makes any difference.
>>>>>>
>>>>>> geir
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> -Patrick
>>>>>>>
>>>>>>> On Nov 5, 2007 8:08 AM, Geir Magnusson Jr. <geir@pobox.com>
 
>>>>>>> wrote:
>>>>>>>> I'm a newbie, so forgive me if I'm not asking the question
the
>>>>>>>> right
>>>>>>>> way.
>>>>>>>>
>>>>>>>> I have a join table in my DB :
>>>>>>>>
>>>>>>>> +-------------+------------------+------+-----+---------

>>>>>>>> +-------+
>>>>>>>> | Field       | Type             | Null | Key | Default |
 
>>>>>>>> Extra |
>>>>>>>> +-------------+------------------+------+-----+---------

>>>>>>>> +-------+
>>>>>>>> | showId      | int(11) unsigned | NO   | PRI |         

>>>>>>>> |       |
>>>>>>>> | inputFileId | int(11) unsigned | NO   | PRI |         

>>>>>>>> |       |
>>>>>>>> +-------------+------------------+------+-----+---------

>>>>>>>> +-------+
>>>>>>>>
>>>>>>>> where showId and inputFileID are PKs in the show table and
>>>>>>>> inputfile
>>>>>>>> table.
>>>>>>>>
>>>>>>>> In my code for the InputFile class :
>>>>>>>>
>>>>>>>>      @ManyToOne
>>>>>>>>      @JoinTable(name="Show2InputFile",
>>>>>>>>              joinColumns = @JoinColumn(name="inputFileId"),
>>>>>>>>              inverseJoinColumns = @JoinColumn(name="showId"))
>>>>>>>>      public Show getShow() {
>>>>>>>>          return show;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> When JPA is instrumenting my classes, it complains :
>>>>>>>>
>>>>>>>> Caused by: <openjpa-1.1.0-SNAPSHOT-r420667:588533 fatal
user
>>>>>>>> error>
>>>>>>>> org.apache.openjpa.persistence.ArgumentException: You have
>>>>>>>> supplied
>>>>>>>> columns for
>>>>>>>> "com.joost.model.logistics.InputFile.show<element:class
>>>>>>>> java.lang.Object>", but this mapping cannot have columns
in  
>>>>>>>> this
>>>>>>>> context.
>>>>>>>>
>>>>>>>>
>>>>>>>> I don't quite understand the error.  I use this same thing
>>>>>>>> elsewhere
>>>>>>>> (I think) w/o a problem.  Can someone give me a hint?
>>>>>>>>
>>>>>>>> geir
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Patrick Linskey
>>>>>>> 202 669 5907
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Patrick Linskey
>>>>> 202 669 5907
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Patrick Linskey
>>> 202 669 5907
>>
>>
>
>
>
> -- 
> Patrick Linskey
> 202 669 5907


Mime
View raw message