]
Krasimir Chobantonov updated HHH-1015:
--------------------------------------
Attachment: hhh-1015.patch
Attaching a patch that fixes the problem - the patch is against Hibernate core version
3.3.1.GA.
Note that because hibernate does not keep the reverse property to the OneToMany
relationships when using HBM (e.g. key element does have only the column information)
then the path relies only on the column name information to get to the reverse property
and to check if it is mapped to a join table (e.g. using SecondaryTable annotation)
Also the code is only modified so that the described case in the issue is going to work
and also fixes the problem with the Hibernate schema validation. Probably there may be
some other places that needs to be fixed as well (this needs to be validated byt the
respective components' owners)
Incorrect SQL generated when one-to-many foreign key is in a
discriminated subclass table
-----------------------------------------------------------------------------------------
Key: HHH-1015
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1015
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.1 beta 2
Environment: Hibernate versions 3.1 beta 3 and 3.0.5
Reporter: Steven Grimm
Priority: Minor
Attachments: hhh-1015.patch
I have the following mappings describing a hierarchy of events and a class that the
events refer to:
<hibernate-mapping package="com.xyz">
<class name="Event" table="event"
discriminator-value="-1">
<id name="Id" type="long"
column="event_id"/>
<discriminator column="event_type_id" type="integer"
/>
<subclass name="EventPayer" discriminator-value="-3">
<join table="event_payer">
<key column="event_id" />
<many-to-one name="payer" column="payer_id"
class="Payer" />
</join>
<subclass name="EventPayerCreated"
discriminator-value="1" />
</subclass>
</class>
<class name="Payer" table="payer">
<id name="payerId" column="payer_id"
type="java.lang.Long"/>
<set name="eventPayers" inverse="true"
cascade="save-update">
<key column="payer_id"/>
<one-to-many class="EventPayer"/>
</set>
</class>
</hibernate-mapping>
When I fetch the Payer.eventPayers collection, Hibernate generates this SQL:
select eventpayer0_.payer_id as payer7_1_,
eventpayer0_.event_id as event1_1_,
eventpayer0_.event_id as event1_5_0_,
eventpayer0_1_.payer_id as payer2_6_0_,
eventpayer0_.event_type_id as event2_5_0_
from event eventpayer0_
inner join event_payer eventpayer0_1_
on eventpayer0_.event_id=eventpayer0_1_.event_id
where eventpayer0_.payer_id=?
The problem is that there is no event.payer_id column; payer_id is in the child table,
not the parent. It appears that specifying a discriminated subclass in <one-to-many>
is the same as specifying the superclass, or that Hibernate is ignoring the subclass's
<join> element. As far as I can tell, this leaves no way to resolve bidirectional
associations where one end of the association is in a discriminated subclass, which seems
like a perfectly reasonable thing to want to do.
I also tried changing <key column="payer_id"/> to <key
property-ref="payer"/> in the Payer class's <set> element, but got
similar behavior in the form of a "property not found" error: Hibernate is
either looking in the superclass's properties rather than the subclass's or is
ignoring the list of properties in the <join> element.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: