如何使EclipseLink不生成主键并将其存入数据库

时间:2016-06-24 12:33:37

标签: java jpa eclipselink liquibase

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

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

现在我有了这个,但它给了我以下例外。

@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]映射到数据库中的主键列。不允许更新。

1 个答案:

答案 0 :(得分:0)

您可以创建一个用于生成ID的序列(而不是此GENERATED BY DEFAULT START WITH 1,INCREMENT 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;
     ....
}