openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marina Vatkina <Marina.Vatk...@Sun.COM>
Subject Re: Problem with @ManyToOne and @JoinTable
Date Tue, 06 Nov 2007 01:26:19 GMT
You need to have @OneToMany(mappedBy="show") - otherwise you get 2 
unidirectional relationships, while you are trying to make them bidirectional.

Regards,
-marina

Geir Magnusson Jr. wrote:
> 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