Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 JPA-如何使用表默认值生成主键?_Java_Oracle_Jpa_Jpa 2.1 - Fatal编程技术网

Java JPA-如何使用表默认值生成主键?

Java JPA-如何使用表默认值生成主键?,java,oracle,jpa,jpa-2.1,Java,Oracle,Jpa,Jpa 2.1,我有一个主键生成为TO_NUMBER(TO_CHAR(SYSDATE@!,'YYDDD')| LPAD(TO_CHAR(SEQ_REFID.NEXTVAL),11,'0'))的表。 这已作为表的默认值提供。当我通过JDBC插入时,我可以将该列保留为NULL,因此将生成/默认pk,并使用getGeneratedKeys()方法获取密钥 我需要类似的行为使用JPA。我是JPA的初学者。请帮忙。 使用的数据库是Oracle11g 编辑:上述值不需要是表格默认值。如果可能,可以从JPA层应用它 其他实体

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

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

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

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


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

在id字段中添加以下注释:

@Column(insertable = false)
这样,JPA在插入新值时将忽略该字段,数据库将自动生成所需的键

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

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

这就是它的本意,它不仅简化了查询,而且提高了性能。您可以查询表中特定小时、周等的条目,或生成详细的统计信息


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

你从哪里知道这个默认PK是个好主意

如果需要行的创建时间,请向表中添加一列。不要像这样把它嵌入PK中

@Entity
public class Entity {

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

}
也可以

GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE

这看起来是一个非常糟糕的数据库设计。为什么不使用整数递增的简单id列?每天预期的事务数将以百万计,在julian date之前加上前缀将有助于从历史记录表中提取事务。这不是您应该做的。使用升序整数创建一个简单的id列,并使用当前sysdate添加一个附加列。这就是它的本意,它不仅简化了查询,而且提高了性能。您还可以查询表中特定小时、周等的条目,或生成详细的统计信息。不要试图将不同的数据放入一个单元格。没有优势。