我有一个主键生成为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传递给所有子表。
答案 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
答案 2 :(得分:0)
你在哪里知道这个默认PK是个好主意?
如果您想要行的创建时间,请在表格中添加一列。不要像这样把它嵌入PK中。