]
Paul Pogonyshev commented on HHH-1015:
--------------------------------------
Why is this 'minor'? It renders inheritance with discriminator pratctically
useless for non-trivial cases, or at least that's how I see it. And inheritance
without discriminator (joined-subclass) gives unbearably huge SQL queries if you have many
subclasses...
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-version2.patch, 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: