当前位置: 首页 > 知识库问答 >
问题:

手动指定JPA@GeneratedValue列中主键的值

顾鸣
2023-03-14

我有一个实体,它有一个主键/id字段,如下所示:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
`id` bigint(20) NOT NULL AUTO_INCREMENT

我试图通过根本不使用@GeneratedValue来解决这个问题,而是简单地手动定义要Auto_Incremented的列。然而,这迫使我始终手动提供IDs,因为EclipseLink会验证主键(因此它可能不是null、0或负数)。异常消息指出我应该指定eclipselink.id_validation,但是这似乎没有什么不同(我注释了@primarykey(validation=idvalidation.none),但是仍然得到了相同的消息)。

澄清一下:我使用EclipseLink(2.4.0)作为持久化提供程序,并且我不能脱离它(项目的大部分依赖于EclipseLink特定的查询提示、注释和类)。

编辑(回应回答):

public class MyNativeSequence extends NativeSequence {

    public MyNativeSequence() {
        super();
    }

    public MyNativeSequence(final String name) {
        super(name);
    }


    @Override
    public boolean shouldAlwaysOverrideExistingValue() {
        return false;
    }

    @Override
    public boolean shouldAlwaysOverrideExistingValue(final String seqName) {
        return false;
    }

}
javax.persistence.RollbackException: Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone [de.dfv.datenbank.domain.Mitarbeiter[ id=null ]], primary key [null]. Set descriptors IdValidation or the "eclipselink.id-validation" property.
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
    ...
Caused by: Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone [de.dfv.datenbank.domain.Mitarbeiter[ id=null ]], primary key [null]. Set descriptors IdValidation or the "eclipselink.id-validation" property.
    at org.eclipse.persistence.exceptions.ValidationException.nullPrimaryKeyInUnitOfWorkClone(ValidationException.java:1451)
    ...

(为清楚起见,缩短了堆栈跟踪)。这和我以前收到的信息是一样的。我不应该子类NativeSequence吗?如果是这样的话,我不知道在Sequence或StandardSequence中为抽象方法实现什么。

还值得注意的是,简单地子类化(不重写任何方法)类就像预期的那样工作。但是,在ShouldAlwaySoverrideExistingValue(...)中返回false根本不会生成一个值(我遍历了这个程序,getGeneratedValue()一次也没有调用)。

此外,当我在一个事务中插入类似8个特定类型的实体时,它会在数据库中产生11条记录(到底是什么?!)。

我试图自己将列定义为auto_increment和ommit@generatedvalue,但是验证将起作用,不允许我保存这样的实体。如果我指定了一个值!=0和!=零,mysql将抱怨主键重复。

我已经没有想法和选择可以尝试了。有吗?(开始赏金)

共有1个答案

颜光临
2023-03-14

这与Eclipselink一起工作。它将为序列创建一个seperate表,但这不应该造成问题。

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", insertable=true, updatable=true, unique=true, nullable=false)
private Long id;

Auto将选择理想的生成策略。由于字段被指定为可插入和可更新,因此将使用表生成策略。这意味着eclipselink将生成另一个保存当前序列值的表,并生成序列本身,而不是将其委托给数据库。由于列被声明为insertable,如果在持久化时id为null,eclipselink将生成id。否则将使用现有id。

 类似资料:
  • 问题内容: 我正在使用Hibernate将对象保存在数据库中。我正在使用@GeneratedValue注释生成主键。 这是我的代码供应商类 我正在使用MS SQL Server 2012,其中有带有以下列的供应商表 未选中表示其NOTNULL = true,不允许使用空值。 这是我试图将数据保存到数据库中的代码。 运行此命令时,出现以下错误 请帮我解决一下这个。我是新来的hibernate并试图学

  • 错误结果为 “OneToOne关系的JPA问题:外键引用的列数错误。应为2” 如何为join测试表指定主键? 表A:列id与表B:列test_id映射

  • 我正在使用Hibernate在数据库中保存一个对象。我正在生成带有@GeneratedValue注释的主键。 这里是我试图将数据保存到数据库中的代码。 当我运行这个时,我得到以下错误

  • 我有一个实体类,jpa正在抛出一个验证异常,说明指定了主键。我不明白为什么。 请参阅下面的详细信息:*内部异常:javax.Persistence.persistenceException:Exception[EclipseLink-28018](Eclipse Persistence.Exceptions.EntityManagerSetupException异常描述:Predeployment

  • 问题内容: 我的主键实体如下所示 当我跑步时,出现错误 无法获取或更新下一个值;嵌套的异常是org.hibernate.exception.SQLGrammerException:无法获取或更新下一个值 但是当我改变为 没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。 问题答案: 当将新创建的实体插入数据库时,告诉JPA提供者使用表从中获取ID。 当使用Hibernate作为提

  • EmbeddedId或IdClass注释用于表示复合主键。如何在没有(EmbeddedId或IdClass)的情况下使用复合主键? 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么如何使用EntityManager.find(Entity Class,Object primaryKey)方法在复合主键(Multiple primaryKey)的情况下查找实体(因为没