Java 如何使EclipseLink不生成主键并将其发送到数据库
我使用Liquibase创建数据库的DDL模式(Derby)。另外,我使用JPA和EclipseLink,我希望创建EclipseLink,这样它就不会为主键插入任何值,我希望它们通过纯sql生成。现在,我试图删除实体中的generation-type策略,但它试图将PKs的null值插入到表中,这是PKs不允许的 如果你能帮助我,我会很高兴的 现在我有这个,但它给了我下面的例外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
@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;
....
}