2014-09-01 6 views
1

Я считаю, что у меня было это, и я должен был что-то сделать. Надеюсь, кто-то сразу увидит проблему.Как сопоставить значение дискриминатора JPA?

Два класса в отношениях наследования. В игре играют два стола. Обе таблицы получают записи. Проблема: значение дискриминатора не сохраняется.

Родитель Класс

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="entp", discriminatorType=DiscriminatorType.STRING) 
@Table(name="enrg") 
public abstract class BaseEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="enid") 
    private Long entityId; 

    // some string property mapped to column 'nm; 
    // some string property mapped to column 'ns; 
    // some string property mapped to column 'tmcr; 

Детский класс

@Entity 
@DiscriminatorValue("ws") 
@Table(name="ws") 
public class Website extends BaseEntity { 
    private static final long serialVersionUID = 1L; 

    @Column(name="exdr", length=100) 
    private String exportDirectory; 

служба вызова

getEntityManager().persist(website); 

SQL

Hibernate: insert into enrg (nm, ns, tmcr) values (?, ?, ?) 
Hibernate: insert into ws (exdr, enid) values (?, ?) 

Hibernate

<persistence-unit name="prod" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>prodDataSource</jta-data-source> 

    <class>webadmin.domain.core.Website</class> 

    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name = "hibernate.show_sql" value = "true" /> 
     <property name = "hibernate.discriminator.ignore_explicit_for_joined" value = "false" /> 
    </properties> 

</persistence-unit> 

Что мне нужно сделать, чтобы Hibernate включают ENTP столбец/значение в вкладышем для enrg? В этом случае значение entp должно быть «ws».

Решение

Все мои отображения/конфигурация остается, как указано выше. Я обновился до Hibernate 4.3.6 и теперь под TomEE 1.7 теперь работает.

Hibernate: insert into enrg (nm, ns, tmcr, entp) values (?, ?, ?, 'ws') 
Hibernate: insert into ws (exdr, enid) values (?, ?) 
+0

Если Hibernate не поддерживает дискриминаторы по стратегии JOINED, то я уверен, что есть много других поставщиков JPA, которые это делают. –

ответ

1

делает this и this помочь вам.

В конце концов, для стратегии SINGLE_TABLE требуется discriminator столбец, JOINED может быть реализован без. В настоящее время проблема с Hibernate заключается в том, что она вызывает непоследовательные данные при сохранении сущностей в наследуемом наследуемом JOINED наложении с @DiscriminatorColumn, хотя спецификация JPA рекомендует сохранять значения дискриминатора, если дискриминатор используется с JOINED.

+0

Чем больше я читаю о Hibernate, тем меньше мне это нравится. Честно говоря, для ручного управления подготовленными операциями требуется гораздо меньше времени, чем для чтения и устранения проблем, спрятанных в реализации библиотеки. – jacekn

+0

@jacekn Да, правильно, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' : P –

+0

@jacekn посмотреть [здесь] (https://hibernate.atlassian.net/browse/HHH-6911), также попробуйте использовать 'DiscriminatorColumn' вместо' DiscriminatorValue' –

Смежные вопросы