Java 实体继承:具有公共值的中心表+;扩展父实体
我的模式如下所示:Java 实体继承:具有公共值的中心表+;扩展父实体,java,hibernate,spring,hibernate-annotations,Java,Hibernate,Spring,Hibernate Annotations,我的模式如下所示: public List<T> findAll() { if (logger.isDebugEnabled()) { logger.debug("findAll"); } return currentSession().createCriteria(getPersistentClass()).list(); } 我的提名表包含我所有4项提名之间的公共数据 我有四类提名: 同事提名 团
public List<T> findAll() {
if (logger.isDebugEnabled()) {
logger.debug("findAll");
}
return currentSession().createCriteria(getPersistentClass()).list();
}
我的提名
表包含我所有4项提名之间的公共数据
我有四类提名:
CATEGORY\u code
上的DiscriminatorColumn
来区分并创建了5个实体,4个实体继承自主提名
实体
提名
实体->同事姓名
,团队姓名
,创意姓名
,成功姓名
我有两个问题:
1。为什么我的特定DAO不从其特定表中获取列?
例如:
www.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();
}
ACTUAL\u Condition
是一个Idea\u Nom列,所以我猜它停在提名
中的公共列,而不是获取特定列
2。我怎样才能获得一份所有提名的名单,不管它们是什么类型的?我可以单独对提名实体运行通用DAO吗?这可能是一个愚蠢的问题,正如我所提到的,我已经有了一个
提名HibernateDao
,但我只是好奇,因为到目前为止,我的计数方法只返回基于鉴别器列的特定计数…在提名中您没有指定继承策略,我认为你应该使用联合策略:
@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 { ... }
你应该看看
(2) 如果您查询提名
层次结构的根,请使用JPA,如上所示:
select n from Nomination n
这是一个多态查询,它还加载提名
子类。在提名
中,您没有指定继承策略,我认为您应该使用连接策略:
@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 { ... }
你应该看看
(2) 如果您查询提名
层次结构的根,请使用JPA,如上所示:
select n from Nomination n
这是一个多态查询,它还加载提名
子类。我将尝试此操作并让您知道。现在我得到:原因:java.sql.SQLException:无效列名“UPDATED_by”。
这属于父实体提名
继承的可审核实体。可以在提名
的代码段顶部看到。添加到我的主要帖子中,我使用了这个实体作为我的骨架实体,我的其他实体,我已经用它测试了各自的DAO…可能hibernate与继承连接和MappedSuperclass中有一个bug。我使用的是hibernate 3.6.7.Final,它说在3.5.1I之后它已经被修复了,我会尝试一下并让你知道。现在我得到:原因:java.sql.SQLException:无效列名“UPDATED_by”。
这属于父实体提名
继承的AuditableEntity
。可以在提名
的代码段顶部看到。添加到我的主要帖子中,我使用了这个实体作为我的骨架实体,我的其他实体,我已经用它测试了各自的DAO…可能hibernate与继承连接和MappedSuperclass中有一个bug。我使用的是hibernate 3.6.7.Final,上面说在3.5.1之后已经修好了