【问题标题】:Cannot use identity column key generation with the strategy TABLE_PER_CLASS in JPA?无法在 JPA 中使用 TABLE_PER_CLASS 策略生成标识列键?
【发布时间】:2012-01-07 06:32:55
【问题描述】:

这个问题与this thread 中提到的问题有关。 在 MySQL 上使用 JPA 时,我也面临同样的问题。只有当我将生成策略更改为 TABLE 时才能解决它。

但问题是,这个问题背后的原因是什么以及为什么将策略更改为 TABLE 是解决方案(这在the thread 中仍未得到解答)?

【问题讨论】:

    标签: inheritance jpa


    【解决方案1】:

    要通过继承层次结构(JPA 要求)拥有唯一的 id,显然不能使用 TABLE_PER_CLASS 和 IDENTITY 来做到这一点,因为 IDENTITY 对一个表起作用,并且继承层次结构中现在有多个“根”表。

    例如抽象基类“Base”和子类“Sub1”、“Sub2”、“Sub3”。 所以你有实际的表“SUB1”、“SUB2”、“SUB3”。因此,如果使用 IDENTITY,那么这将等同于使用 MySQL 时列上的“自动增量”。因此 SUB1 有它的 ids,SUB2 有它的 ids,SUB3 有它的 ids ......它们是独立的,因此可能会在 id 中发生冲突......所以你在继承层次结构中不再有唯一的 id。

    【讨论】:

      【解决方案2】:

      如果你想在类之间共享一些属性,你可以使用@MappedSuperclass给超类,这不会影响子类Id的生成策略。它只是将所有注释复制到子类

      @MappedSuperclass
      public class BaseEntity {
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private long id;
      
          @Temporal(TemporalType.TIMESTAMP)
          @Column(columnDefinition = "TIMESTAMP")
          private Date createTime = new Date();
      
      
          public long getId() {
              return id;
          }
      
          public void setId(long id) {
              this.id = id;
          }
      
          public Date getCreateTime() {
              return createTime;
          }
      
          public void setCreateTime(Date createTime) {
              this.createTime = createTime;
          }
      }
      

      【讨论】:

        【解决方案3】:

        接受的答案(虽然旧)并不完全正确。使用 GenerationType.IDENTITY 并不意味着数据库使用表生成。 GenerationType.IDENTITY 的 javadoc 说:“表明持久性提供者必须使用数据库标识列为实体分配主键。”。

        【讨论】:

          猜你喜欢
          • 2014-01-29
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 2019-03-01
          • 1970-01-01
          • 2021-03-25
          • 2016-03-23
          • 1970-01-01
          相关资源
          最近更新 更多