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