Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体继承:具有公共值的中心表+;扩展父实体_Java_Hibernate_Spring_Hibernate Annotations - Fatal编程技术网

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项提名之间的公共数据

我有四类提名:

  • 同事提名
  • 团队提名
  • 创意提名
  • 成功提名
  • 现在,正如您所看到的,我只对4个表中的3个进行了建模,这是因为在这个遗留数据模型上,同事提名需要的唯一数据是提名表中的数据

    因此,基本上我使用列
    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之后已经修好了