我的数据库中只有一个表,并且在字段上添加了@Id属性。作为strategy,我使用GenerationType.IDENTITY。当数据库表尚未由SQL脚本中的行填充时,此方法可以正常工作。

当表中已经有一些行时,如何设法使其正常工作?因为当我尝试从应用程序中预填充实体时插入实体时,它不起作用。

我正在为此使用Derby数据库,并使用eclipselink作为实现。

最佳答案

使用从序列表获取其ID的序列生成器。像这样:

@Id
@GeneratedValue(generator = "yourTableIdGenerator")
@GenericGenerator(name = "yourTableIdGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
                    @Parameter(name = "sequence_name", value = "your_table_id_seq"),
                    @Parameter(name = "optimizer", value = "hilo"),
                    @Parameter(name = "initial_value", value = "1000"),
                    @Parameter(name = "increment_size", value = "10") }
                )
@Column(name = "your_table_id", length = 15)
public Long getId() {
    return id;
}

将initial_value设置为大于脚本中填充的行的最大ID的值。

从Java 6 EE API中:http://download.oracle.com/javaee/6/api/javax/persistence/TableGenerator.html
@TableGenerator(
   name="empGen",
   table="ID_GEN",
   pkColumnName="GEN_KEY",
   valueColumnName="GEN_VALUE",
   pkColumnValue="EMP_ID",
   initialValue = 1000,
   allocationSize=1)
@Id
@GeneratedValue(strategy=TABLE, generator="empGen")
int id;

09-27 02:02
查看更多