我的模式是這樣的中央表:實體繼承:有共同的價值觀+擴展的父親實體
我NOMINATION
表對我的提名的所有4之間共同的數據。
我有4種類型的提名:
- 同事提名
- 團隊提名
- 理念提名
- 成功提名
現在,你可以看到我只有3 4代表的藍本,這是因爲在這傳統的數據模型,在同事提名需要的唯一數據是在提名錶。
因此,基本上我使用DiscriminatorColumn
列CATEGORY_CODE
區分和製造了5個實體,其中4個實體繼承自主實體(Nomination
)。
Nomination
實體 - >CoworkerNom
,TeamNom
,IdeaNom
,SuccessNom
。
我有兩個問題:從特定的表
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
你沒有指定繼承策略
我會試試這個,讓你知道。 – Nimchip 2012-02-10 15:25:40
現在我得到了:'引起:java.sql.SQLException:無效的列名稱'UPDATED_BY'。'這屬於'AuditableEntity',父實體'提名'繼承。在「提名」片段中可以看到頂部。 – Nimchip 2012-02-10 15:31:32
添加到我的主要職位,我已經使用這個實體作爲我的骨架實體和我的其他實體,我已經測試了它們各自的DAO工作,它只是很好... – Nimchip 2012-02-10 15:38:01