首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使EclipseLink不生成主键并将主键发送到数据库

如何使EclipseLink不生成主键并将主键发送到数据库
EN

Stack Overflow用户
提问于 2016-06-24 20:33:37
回答 1查看 882关注 0票数 1

我使用Liquibase创建数据库(Derby)的DDL模式。另外,我使用了JPA和sql,并且我希望使用EclipseLink,这样它就不会为主键插入任何值,并且我希望通过纯EclipseLink生成它们。现在,我尝试删除实体中的生成类型策略,但它试图将PKs的空值插入到表中,这对于PKs是不允许的。

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

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

代码语言:javascript
复制
@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;

代码语言:javascript
复制
CREATE TABLE Role (
id BIGINT PRIMARY KEY NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
role VARCHAR(255)
);

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

EN

回答 1

Stack Overflow用户

发布于 2016-06-24 20:51:02

您可以创建一个用于生成ID的序列(而不是默认生成的序列,从1开始,以1为增量)。这是一种更好的方法,之后你可以在JPA中使用你的序列:

代码语言:javascript
复制
   ...
    @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中使用sequence来获取新的ID值。

有关更多信息,请查看https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing

不幸的是,如果你的数据库不支持序列,这个方法就不能工作。

或者对于您的Derby DB,您可以尝试这样做(如果主键作为标识生成)

代码语言:javascript
复制
@Entity
public class EntityWithIdentityId {
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id;
     ....
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38013575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档