我使用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]映射到数据库中的主键列。不允许更新。
答案 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;
....
}