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约束冲突。如果是这种情况,我可以建议:
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)
)