У меня есть две таблицы «Задача» и «Содержание».Я использую наследование одной таблицы с дискриминатором для сопоставления двух объектов (PrimaryContent, AttachmentContent) с таблицей «Содержание».У меня есть родительский объект Task, который содержит отношения «один к одному» с двумя объектами содержимого.Я могу вставить объект Task и его коллекции PrimaryContents и AttachmentContents.Я вижу, что Hibernate вставляет правильное значение в столбцы дискриминатора для каждого типа.Проблема заключается в том, что когда я запрашиваю сущность Task и ее коллекции сущностей контента, hibernate генерирует исключение -> вызвано: org.hibernate.WrongClassException: объект с id: 10024 не принадлежит указанному подклассу: com.xxx.PrimaryContent(загруженный объект был неправильного класса класса com.xxx.AttachmentContent).Похоже, что столбец дискриминатора не используется в сгенерированном операторе выбора select.
Здесь вы можете видеть, что сущность Task правильно запрашивается на основе его pk:
Hibernate: select * from ( select communicat0_.COMM_TASK_ID as COMM1_92_, communicat0_.BUSINESS_CONTEXT as BUSINESS2_92_, communicat0_.BUSINESS_ID as BUSINESS3_92_, communicat0_.CREATE_DT as CREATE4_92_, communicat0_.STAT_RSN_CD as STAT5_92_, communicat0_.SENDERS_EMAIL_ID as SENDERS6_92_, communicat0_.SENDERS_NM as SENDERS7_92_, communicat0_.STATUS_DT as STATUS8_92_, communicat0_.STATUS_CD as STATUS9_92_, communicat0_.SOURCE_SYSTEM as SOURCE10_92_, communicat0_.TRANSACTION_REFERENCE_ID as TRANSAC11_92_, communicat0_.UPDATE_DT as UPDATE12_92_, communicat0_.USER_ID as USER13_92_ from COMMPREF.COMMUNICATION_TASKS communicat0_ where communicat0_.COMM_TASK_ID=10029 ) where rownum <= ?
Вот запрос для одной из его коллекций (сущность PrimaryContent):
Hibernate: select primarycon0_.COMM_TASK_ID as COMM24_92_1_, primarycon0_.COMM_CONTENT_ID as COMM2_1_, primarycon0_.COMM_CONTENT_ID as COMM2_93_0_, primarycon0_.ARCHIVE_DT as ARCHIVE3_93_0_, primarycon0_.ARCHIVE_REF_ID as ARCHIVE4_93_0_, primarycon0_.FILE_NAME as FILE5_93_0_, primarycon0_.FILE_PATH as FILE6_93_0_, primarycon0_.FORMAT_TYPE_CD as FORMAT7_93_0_, primarycon0_.CONTENT_NM as CONTENT8_93_0_, primarycon0_.PAGE_COUNT as PAGE9_93_0_, primarycon0_.COMM_CAT_CD as COMM10_93_0_, primarycon0_.EDIT_YN as EDIT11_93_0_, primarycon0_.FILE_LOCKED_BY as FILE12_93_0_, primarycon0_.FILE_LOCKED_DT as FILE13_93_0_, primarycon0_.PREVIEW_YN as PREVIEW14_93_0_, primarycon0_.STAT_RSN_CD as STAT15_93_0_, primarycon0_.STATUS_DT as STATUS16_93_0_, primarycon0_.STATUS_CD as STATUS17_93_0_, primarycon0_.COMM_TASK_ID as COMM24_93_0_, primarycon0_.TEMPLATE_ID as TEMPLATE18_93_0_, primarycon0_.TEMPLATE_NM as TEMPLATE19_93_0_, primarycon0_.TEMPLATE_VERSION as TEMPLATE20_93_0_, primarycon0_.USER_ID as USER21_93_0_ from COMMPREF.COMM_CONTENTS primarycon0_ where primarycon0_.COMM_TASK_ID=?
Как видите, в предложении where нет столбца дискриминатора.Это просто проблема с моим отображением сущностей?Я включил таблицы и приведенную ниже схему:
Таблицы:
Tasks:
+id (pk)
+other fields
contents:
+id (pk)
+task_id (fk)
+primary_content_id (fk) <-- the self association
+segment_type <-- my discriminator column
Задача:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<description></description>
<package></package>
<schema></schema>
<access>FIELD</access>
<entity class="com.xxx.CommunicationTask"
access="FIELD" metadata-complete="true">
<table name="COMMUNICATION_TASKS" />
<attributes>
<id name="id">
<column name="COMM_TASK_ID" />
<generated-value strategy="SEQUENCE" generator="TASK_SEQ" />
<sequence-generator name="TASK_SEQ"
sequence-name="COMMPREF.TASK_SEQ" allocation-size="1" />
</id>
<one-to-many name="attachmentContents" target- entity="com.xxx.AttachmentContent"
mapped-by="task" orphan-removal="true">
<cascade>
<cascade-all />
</cascade>
</one-to-many>
<one-to-many name="primaryContents" target-entity="com.xxx.PrimaryContent"
mapped-by="task" orphan-removal="true">
<cascade>
<cascade-all />
</cascade>
</one-to-many>
</attributes>
</entity>
</entity-mappings>
База содержимого:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<description></description>
<package></package>
<schema></schema>
<access>FIELD</access>
<entity name="CommunicationContent" class="com.xxx.CommunicationContent" access="FIELD" metadata-complete="true">
<table name="COMM_CONTENTS"/>
<discriminator-column name="COMM_SGMNT_TYPE_CD"/>
<attributes>
<id name="id">
<column name="COMM_CONTENT_ID"/>
<generated-value strategy="SEQUENCE" generator="CONTENT_SEQ"/>
<sequence-generator name="CONTENT_SEQ" sequence-name="COMMPREF.CONTENT_SEQ" allocation-size="1"/>
</id>
</attributes>
</entity>
</entity-mappings>
основной контент:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<description></description>
<package></package>
<schema></schema>
<access>FIELD</access>
<entity name="PrimaryContent" class="com.xxx.PrimaryContent"
access="FIELD" metadata-complete="true">
<discriminator-value>P</discriminator-value>
<attributes>
<many-to-one name="task" fetch="LAZY">
<join-column name="COMM_TASK_ID" nullable="false"/>
</many-to-one>
</attributes>
</entity>
</entity-mappings>
вложение:
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<description></description>
<package></package>
<schema></schema>
<access>FIELD</access>
<entity name="AttachmentContent" class="com.xxx.AttachmentContent"
access="FIELD" metadata-complete="true">
<discriminator-value>A</discriminator-value>
<attributes>
<many-to-one name="task" fetch="LAZY">
<join-column name="COMM_TASK_ID" nullable="false"/>
</many-to-one>
</attributes>
</entity>
</entity-mappings>