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

时间:2015-07-17 08:57:12

标签: 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的初学者。 Pl帮助。 使用的数据库是Oracle 11g。

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

其他实体依赖于此实体的pk。必须将PK传递给所有子表。

3 个答案:

答案 0 :(得分:1)

将以下注释添加到id字段:

@Column(insertable = false)

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

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

使用升序整数创建一个简单的id列(除了“ this is entry nr.x ”之外的绝对意义)。然后添加一个包含当前时间戳的附加列。此时间戳可以具有默认值并受到保护以防止更新。

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

不要尝试将多个信息放入一列。没有优势。

答案 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 :(得分:0)

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

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