gpt4 book ai didi

java - 如何使 EclipseLink 不生成主键并将其传递给数据库

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:21 27 4
gpt4 key购买 nike

我使用 Liquibase 创建数据库(Derby)的 DDL 架构。另外,我使用 JPA 和 EclipseLink,我想制作 EclipseLink,以便它不会插入任何主键值,并且我希望它们通过纯 sql 生成。现在,我尝试删除实体中的生成类型策略,但它试图将 PK 的空值插入到表中,这是 PK 不允许的。

如果你能帮助我,我会很高兴。

现在我有了这个,但它给了我下面的异常(exception)。

@Entity
@XmlRootElement
@Table(name = "ROLE")
public class Role implements Serializable {

private static final long serialVersionUID = 4736444799522006644L;

@ Id
@ JsonIgnore
@ GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;

并且

CREATE TABLE Role (
id BIGINT PRIMARY KEY NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
role VARCHAR(255)
);

异常描述:类 [...] 的属性 [id] 映射到数据库中的主键列。不允许更新。

最佳答案

您可以创建一个用于生成 ID 的序列(而不是 GENERATED BY DEFAULT START WITH 1, INCRMENT BY 1)。这是一种更好的方法,之后您可以在 JPA 中使用您的序列:

   ...
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ")
@SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100)
private long id;
...
}

您可以在 SQL 中使用序列 <sequence>.NEXTVAL获取新的ID值。

欲了解更多信息 - 请查看https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing

不幸的是,如果您的数据库不支持序列,则此方法将不起作用。

或者对于您的 Derby DB,您可以尝试此操作(如果主键作为身份生成)

@Entity
public class EntityWithIdentityId {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
....
}

关于java - 如何使 EclipseLink 不生成主键并将其传递给数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38013575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com