Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
Sql 基本实体无表的Hibernate继承_Sql_Hibernate_Jpa - Fatal编程技术网

Sql 基本实体无表的Hibernate继承

Sql 基本实体无表的Hibernate继承,sql,hibernate,jpa,Sql,Hibernate,Jpa,我从未在hibernate中使用过继承,我不知道应该使用哪种策略(甚至我真的需要使用这种策略)。我有三个具有相同接口(相同列)的表,我想为它们创建三个具有基本接口的实体,因此看起来如下所示: @Entity + Basic + @Entity @Table(name="TABLE_1") Table1 + @Entity @Table(name="TABLE_2") Table2 + @Entity @

我从未在hibernate中使用过继承,我不知道应该使用哪种策略(甚至我真的需要使用这种策略)。我有三个具有相同接口(相同列)的表,我想为它们创建三个具有基本接口的实体,因此看起来如下所示:

  @Entity
+ Basic

    + @Entity
      @Table(name="TABLE_1")
      Table1

    + @Entity
      @Table(name="TABLE_2")
      Table2

    + @Entity
      @Table(name="TABLE_3")
      Table3
public void process(BaseEntity entity){
   // processing..
}
如您所见,我不想将表用于基本实体。如果有可能实现这种继承,如何实现?也许我不需要“休眠”继承,我应该使用普通继承

在应用中,它是这样使用的:

  @Entity
+ Basic

    + @Entity
      @Table(name="TABLE_1")
      Table1

    + @Entity
      @Table(name="TABLE_2")
      Table2

    + @Entity
      @Table(name="TABLE_3")
      Table3
public void process(BaseEntity entity){
   // processing..
}
  • 在配置的某个地方,我们存储了要使用哪个实体的信息(表1、表12或表3)
  • Choosen实体用于我们的查询(一些是在HQL中编写的,一些是在Criteria中编写的),所以每个查询都应该知道要使用哪个实体
  • 编辑

    此外,每个实体都可以用作某些实体的属性,我们不知道应该使用哪个表。例如:

    @Entity
    @Table(name="USER")
    class User {
    
        @Id
        private Integer id;
    
        @ManyToOne
        @JoinColumn(name = "SOME_ID", referencedColumnName = "ID", nullable = false)
        private Basic basicEntity; // how to use proper strategy using some configuration value (eg. class static attribute or configuration value stored in db?)
    }
    

    我认为这是实现目标的推荐方式:

    @MappedSuperclass
    public abstract class BaseEntity {
        public static final int SHARED_PAREMETER = 2;
    
        @Column(name = "modified", columnDefinition = "TIMESTAMP DEFAULT NOW()")
        protected Date modified;
    
        //... other fields, getters and setters
    }
    
    @Entity
    @Table(name = "TABLE_1")
    public class Table1 {
        @Id
        private Integer id;
    
        @ManyToOne
        @JoinColumn(name = "SOME_ID", referencedColumnName = "ID", nullable = false)
        private Table2 table2;  
    }
    
    @Entity
    @Table(name = "TABLE_2")
    public class Table2 {
        @Id
        private Integer id;
    }
    
    在本例中,我们将只有两个表,但这两个表都有来自BaseEntity的字段。但是,您不能在实体中建立与抽象类的关系,但在处理过程中,您完全有权这样做:

      @Entity
    + Basic
    
        + @Entity
          @Table(name="TABLE_1")
          Table1
    
        + @Entity
          @Table(name="TABLE_2")
          Table2
    
        + @Entity
          @Table(name="TABLE_3")
          Table3
    
    public void process(BaseEntity entity){
       // processing..
    }