【问题标题】:How to set up @Id field properly when database table is already populated JPA当数据库表已经填充JPA时如何正确设置@Id字段
【发布时间】:2011-12-28 15:53:17
【问题描述】:

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

当表中已经有一些行时,我怎样才能让它工作?因为当我尝试在预填充应用程序中插入实体时,它不起作用。

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

【问题讨论】:

  • “它不起作用”是什么意思?插入实体时会发生什么?

标签: java jakarta-ee jpa derby


【解决方案1】:

我会假设您的错误是因为您为表创建的 IDENTITY 以“1”开始(例如),并且您已经使用 id 为“1”的行填充了表。所以肯定存在PK约束违规。如果这是我可以建议的场景:

  1. 检查预填充数据的行数。以 3500 为例。
  2. 在上级编号中创建标识列以避免违反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)
)

【讨论】:

  • 是的,这就是我得到的错误。我不知道我是否理解正确:我应该手动检查计数还是用代码检查?我可以在 JPA/eclipselink 中做这个“偏移”吗
  • 您可以手动查看。如果您不知道行数,您可以通过例如 1000000 以最高数字开始标识。如果您需要在创建表后填充数据我的建议是您使用标识,以便在 ID 上插入 null场地。如果您需要保留将插入数据库中的行的 ID,您可能需要一个新列
【解决方案2】:

使用从序列表中获取其 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;

【讨论】:

  • 你怎么知道作者在使用Hibernate?
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2013-03-19
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多