Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使EclipseLink不生成主键并将其发送到数据库_Java_Jpa_Eclipselink_Liquibase - Fatal编程技术网

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

Java 如何使EclipseLink不生成主键并将其发送到数据库,java,jpa,eclipselink,liquibase,Java,Jpa,Eclipselink,Liquibase,我使用Liquibase创建数据库的DDL模式(Derby)。另外,我使用JPA和EclipseLink,我希望创建EclipseLink,这样它就不会为主键插入任何值,我希望它们通过纯sql生成。现在,我试图删除实体中的generation-type策略,但它试图将PKs的null值插入到表中,这是PKs不允许的 如果你能帮助我,我会很高兴的 现在我有这个,但它给了我下面的例外 @Entity @XmlRootElement @Table(name = "ROLE") public class

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

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

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

@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;


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

您可以创建一个生成ID的序列(而不是默认情况下从1开始生成,增量为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
.NEXTVAL
中的序列来获取新的ID值

欲了解更多信息-请查看

不幸的是,如果您的数据库不支持序列,这种方法将无法工作

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


您可以创建一个生成ID的序列(而不是默认情况下从1开始生成,增量为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
.NEXTVAL
中的序列来获取新的ID值

欲了解更多信息-请查看

不幸的是,如果您的数据库不支持序列,这种方法将无法工作

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


是要生成序列ID还是如何生成?(在DB级别)默认情况下,id BIGINT主键NOT NULL生成为标识(从1开始,增量为1)。映射看起来很好,但您似乎正在修改实体的id值,错误声明不允许该值。当错误发生时,您在应用程序中到底要做什么?是要按顺序生成ID还是如何生成ID?(在DB级别)默认情况下,id BIGINT主键NOT NULL生成为标识(从1开始,增量为1)。映射看起来很好,但您似乎正在修改实体的id值,错误声明不允许该值。当错误发生时,您在应用程序中到底想做什么?
@Entity
public class EntityWithIdentityId {
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id;
     ....
}