Java 当数据库表已填充JPA时,如何正确设置@Id字段

Java 当数据库表已填充JPA时,如何正确设置@Id字段,java,jakarta-ee,jpa,derby,Java,Jakarta Ee,Jpa,Derby,我的数据库中只有一个表,我在字段上添加了@Id属性。作为策略我使用GenerationType.IDENTITY。当数据库表尚未由SQL脚本中的行填充时,这种方法可以正常工作 当表中已经有一些行时,如何使其工作?因为当我试图从预填充的应用程序中插入实体时,它不起作用 我使用Derby数据库来实现这个,并使用eclipselink作为实现。使用序列生成器从序列表获取其ID。大概是这样的: @Id @GeneratedValue(generator = "yourTableIdGenerator")

我的数据库中只有一个表,我在字段上添加了
@Id
属性。作为
策略
我使用
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;
}
将初始_值设置为大于从脚本填充的行的最大id的值

从java 6 ee api:


我假设您的错误是因为您为表创建的标识(通过示例)在“1”中开始,并且您已经用id为“1”的行填充了表。所以肯定存在PK约束冲突。如果是这种情况,我可以建议:

  • 检查预填充数据的行数。举例来说,3500
  • 以上级编号创建标识列以避免PK约束冲突,举例来说,下表从4000开始标识:
  • 这应该在Derby DB中工作

    CREATE TABLE MAPS    (
        MAP_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 4000, INCREMENT BY 1),
        MAP_NAME VARCHAR(24) NOT NULL,
        REGION VARCHAR(26),
        AREA DECIMAL(8,4) NOT NULL,
        PHOTO_FORMAT VARCHAR(26) NOT NULL,
        PICTURE BLOB(102400),
        UNIQUE (MAP_ID, MAP_NAME)
    )
    

    你怎么知道作者在使用Hibernate?什么意思是“它不工作”?插入实体时会发生什么?是的,这就是我得到的错误。我不知道我是否理解你的意思:我应该手动还是用代码检查计数?当然,我可以在JPA/EclipseLKyo中设置这个“偏移量”,你可以手动检查。如果您不知道行数,您可以通过示例1000000以最大的数字开始标识。如果在创建表后需要填充数据,我建议您使用标识,以便在ID字段中插入null。如果需要保留将插入数据库的行的ID,则可能需要一个新列
    CREATE TABLE MAPS    (
        MAP_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 4000, INCREMENT BY 1),
        MAP_NAME VARCHAR(24) NOT NULL,
        REGION VARCHAR(26),
        AREA DECIMAL(8,4) NOT NULL,
        PHOTO_FORMAT VARCHAR(26) NOT NULL,
        PICTURE BLOB(102400),
        UNIQUE (MAP_ID, MAP_NAME)
    )