【问题标题】:JPA - How to use table default value for primary key generation?JPA - 如何使用表默认值生成主键?
【发布时间】:2015-07-17 08:57:11
【问题描述】:

我有一张主键生成为TO_NUMBER(TO_CHAR(SYSDATE@!,'YYDDD')||LPAD(TO_CHAR(SEQ_REFID.NEXTVAL),11,'0'))的表

这是表格的默认值。当我通过 JDBC 插入时,我可以将该列保留为 NULL,因此 pk 将被生成/默认,我将使用 getGeneratedKeys() 方法获取密钥。

我需要使用 JPA 的类似行为。我是JPA的初学者。请帮忙。 使用的数据库是 Oracle 11g。

编辑: 上述值不需要是表默认值。如果可能,可以从 JPA 层应用。

其他实体依赖这个实体进行PK。 PK 必须传递给所有子表。

【问题讨论】:

  • 这看起来像是一个非常糟糕的数据库设计。有没有理由不使用增加整数的简单 id 列?
  • 预计每天的交易数量会以百万计,前缀朱利安日期将有助于从历史表中提取交易。
  • 你不应该这样做。使用升序整数创建一个简单的 id 列,并添加一个具有当前 sysdate 的附加列。这就是它应该的样子,不仅简化了您的查询,而且还提高了性能。您还可以在表格中查询特定小时、周等的条目,或生成详细的统计信息。不要试图将不同的数据放入一个单元格中。没有优势。

标签: java oracle jpa jpa-2.1


【解决方案1】:
@Entity
public class Entity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

}

也可以

GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE

This reference describes the various strategies

【讨论】:

    【解决方案2】:

    在id字段中添加如下注解:

    @Column(insertable = false)
    

    这样,JPA 在插入新值时会忽略该字段,并且数据库会自动生成所需的键。

    但是,您不应该使用这样的主键。它在一列中有效地包含 2 种不同类型的数据,最好将它们分成两个单独的列。

    使用升序整数创建一个简单的 id 列(绝对含义不是“this is entry nr.x”)。然后添加一个带有当前时间戳的附加列。这个时间戳可以有一个默认值并且可以防止更新。

    这就是它应有的方式,不仅可以简化您的查询,还可以提高性能。您可以在表格中查询特定小时、周等的条目,或者生成详细的统计信息。

    不要试图将多个信息放在一列中。没有优势。

    【讨论】:

      【解决方案3】:

      您从哪里得知这个默认 PK 是个好主意?

      如果您想要行的创建时间,请在表中添加一列。不要这样嵌入PK中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-27
        • 2012-08-03
        • 1970-01-01
        • 2012-06-18
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        相关资源
        最近更新 更多