2014-09-01 83 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 (?, ?) 

休眠

<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> 

什麼我需要做的,有休眠包括在插入的enrg ENTP列/價值?在這種情況下,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提供者可以這樣做。 – 2014-09-01 07:00:18

回答

1

確實thisthis幫助你。

最後只有SINGLE_TABLE策略需要一個discriminator列,JOINED可以不帶。目前Hibernate的問題在於,如果持久化JOINED繼承中的子實體與@DiscriminatorColumn進行映射,即使JPA規範建議在與JOINED一起使用鑑別器時仍保留鑑別器值,它會導致數據不一致。

+0

我對Hibernate的瞭解越多,我越喜歡它。老實說,手動管理預處理語句的時間比讀取和解決庫實現中隱藏的問題要少得多。 – jacekn 2014-09-01 04:34:38

+0

@jacekn是正確的,它的'statement'和'perpared語句'只在Hibernate下,但'Hibernate'確實有很多,比如會話管理,緩存等。 更多你閱讀和實現,更多你會喜歡。 :P – 2014-09-01 04:36:53

+0

@jacekn看看[這裏](https://hibernate.atlassian.net/browse/HHH-6911),也可以嘗試使用'DiscriminatorColumn'而不是'DiscriminatorValue' – 2014-09-01 05:16:03