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

标签 java jpa eclipselink liquibase

我使用 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/

相关文章:

java - 在具有 Intent 的 Activity 之间传递文本

java - 具有附加参数的 JPA 关系 ManyToMany

hibernate - 最佳实践——实体内部的 Hibernate 持久性代码?

java - EclipseLink - 并发异常 - signalAttemptedBeforeWait

java - Android 应用程序关闭而不打开

java - 查找二维数组中数字的位置

mysql - 手动删除表后,Eclipselink 无法在 MySQL 数据库中创建表

java - 使用 JPA 从现有数据库检索信息

hibernate - JPA。从 Hibernate 迁移到 Eclipselink 时的事务问题

java - 如何从java中的固定数组中删除最后一项