2012-02-10 48 views
1

我的模式是這樣的中央表:實體繼承:有共同的價值觀+擴展的父親實體

Schema

NOMINATION表對我的提名的所有4之間共同的數據。

我有4種類型的提名:

  1. 同事提名
  2. 團隊提名
  3. 理念提名
  4. 成功提名

現在,你可以看到我只有3 4代表的藍本,這是因爲在這傳統的數據模型,在同事提名需要的唯一數據是在提名錶。

因此,基本上我使用DiscriminatorColumnCATEGORY_CODE區分和製造了5個實體,其中4個實體繼承自主實體(Nomination)。

Nomination實體 - >CoworkerNomTeamNomIdeaNomSuccessNom

我有兩個問題:從特定的表

1.爲什麼我的具體的DAO不取列? 例如:

Nomination.java:

@Entity(name = "Nomination") 
@Table(name = "NOMINATION") 
@DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1) 

public class Nomination extends AuditableEntity { 

    @Id 
    @Column(name = "NOM_ID", insertable = true, updatable = true, 
      nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @Transient 
    protected NominationType type = null; 

    //So on 

IdeaNom.java:

@Entity(name = "IdeaNom") 
@Table(name = "IDEA_NOM") 
@DiscriminatorValue("I") 

public class IdeaNom extends Nomination { 

    @Column(name = "PURPOSE_INC", insertable = true, updatable = true, 
      nullable = true) 
    private Boolean purposeIncrease; 

    @Column(name = "PURPOSE_SIMPLIFY", insertable = true, updatable = true, 
      nullable = true) 
    private Boolean purposeSimplify; 

    //so on 

AuditableEntity.java:

@MappedSuperclass 
public abstract class AuditableEntity { 
    /** 
    * The user who last updated this object. This object is lazy loaded, so 
    * make sure a session is open 
    */ 
    @ManyToOne(cascade = {CascadeType.PERSIST, 
      CascadeType.MERGE}, fetch = FetchType.LAZY /*optional = true*/) 
    @JoinColumn(name = "UPDATED_BY", referencedColumnName = "EMP_ID", 
      nullable = true) 
    @Cascade(value = {org.hibernate.annotations.CascadeType.PERSIST, 
      org.hibernate.annotations.CascadeType.MERGE, 
      org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
    private Employee modifiedBy = null; 
    /** 
    * The last system update timestamp for this entity 
    */ 
    @Column(name = "UPDATED_DATE", nullable = true) 
    @Temporal(value = TemporalType.TIMESTAMP) 
    private Date modifiedOn = null; 

    //getters and setters 

我findByAll方法是這樣的:

public List<T> findAll() { 
     if (logger.isDebugEnabled()) { 
      logger.debug("findAll"); 
     } 
     return currentSession().createCriteria(getPersistentClass()).list(); 
    } 

和我的DAO,基本上是從哪裏AbstractHibernateDAO這個方法位於繼承。它是這樣AbstractHibernateDAO - >NominationHibernateDAO - >IdeaNomHibernateDAO

我得到以下錯誤:

Caused by: java.sql.SQLException: Invalid column name 'ACTUAL_SITUATION'. 
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368) 
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820) 
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258) 
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632) 
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477) 
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:778) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
    at org.hibernate.loader.Loader.doList(Loader.java:2533) 
    ... 38 more 

ACTUAL_SITUATION是Idea_Nom列,所以我在公共列從NOMINATION猜測它停止,而不是獲取特定的列。

2.我將如何獲得所有提名的名單,儘管他們的類型?我可以自己對提名實體運行一個通用的DAO嗎?這可能是一個愚蠢的問題,因爲我已經提到我已經有一個NominationHibernateDAO但我只是好奇,因爲到目前爲止我的計數方法只返回基於DiscriminatorColumn的具體計數...在Nomination你沒有指定繼承策略

回答

1

,我認爲你應該使用JOINED策略:

@Entity(name = "Nomination") 
@Table(name = "NOMINATION") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Nomination extends AuditableEntity { 

    @Id 
    @Column(name = "NOM_ID", insertable = true, updatable = true, 
     nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @Transient 
    protected NominationType type = null; 

    ... 
} 

@Entity 
@PrimaryKeyJoinColumn(name="NOM_ID") 
public class IdeaNom extends Nomination { ... }   

你應該看看Mapping Entities

(2)使用JPA如果你在做一個查詢Nomination的層次結構的根,像上面:

select n from Nomination n 

它是一個多態查詢,它加載人所以Nomination的子類。

+0

我會試試這個,讓你知道。 – Nimchip 2012-02-10 15:25:40

+0

現在我得到了:'引起:java.sql.SQLException:無效的列名稱'UPDATED_BY'。'這屬於'AuditableEntity',父實體'提名'繼承。在「提名」片段中可以看到頂部。 – Nimchip 2012-02-10 15:31:32

+0

添加到我的主要職位,我已經使用這個實體作爲我的骨架實體和我的其他實體,我已經測試了它們各自的DAO工作,它只是很好... – Nimchip 2012-02-10 15:38:01