Java 使用JPA和自动生成的主键在数据库中创建条目
我是一名JavaEE/JPA新手,目前正在参加JavaEE编程的初学者课程 我正在尝试在一个数据库中创建新条目,该数据库为 生成要用作主键的ID 这是Eclipse从数据库表生成的实体:Java 使用JPA和自动生成的主键在数据库中创建条目,java,jpa,jakarta-ee,Java,Jpa,Jakarta Ee,我是一名JavaEE/JPA新手,目前正在参加JavaEE编程的初学者课程 我正在尝试在一个数据库中创建新条目,该数据库为 生成要用作主键的ID 这是Eclipse从数据库表生成的实体: @Entity @Table(name = "ADDR_PROJ") public class AddrProj implements Serializable { private static final long serialVersionUID = 1L; @Id @SequenceG
@Entity
@Table(name = "ADDR_PROJ")
public class AddrProj implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "ADDR_PROJ_ID_GENERATOR", sequenceName = "ADDR_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"ADDR_PROJ_ID_GENERATOR")
@Column(insertable = false, updatable = false)
private long id;
// ...
// other fields
}
(顺便说一句,long getId()
已实现,但void setId(long)
未实现。)
该表和序列是使用以下SQL语句创建的:
CREATE TABLE addr_proj (
id INTEGER PRIMARY KEY,
name VARCHAR(30),
address VARCHAR(30),
birthday DATE,
email VARCHAR(50),
workphone DECIMAL(4,0)
);
CREATE SEQUENCE addr_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE;
使用如下语句手动插入到表中效果良好:
INSERT INTO addr_proj VALUES
(
addr_seq.nextval,
'Matt',
'3 Fake Ave, Madeuptown',
'01-apr-1980',
'matt@madeupemail.com',
'1234'
);
void add(AddrProj item) {
em.persist(item);
}
但是,当我尝试通过DAO进行更新时,会出现如下错误:
Caused By: org.apache.openjpa.lib.jdbc.ReportingSQLException:
ORA-01400: cannot insert NULL into ("AJP05"."ADDR_PROJ"."ID")
{prepstmnt 28 INSERT INTO ADDR_PROJ (address, birthday, email, name,
workphone) VALUES (?, ?, ?, ?, ?) [params=(String) 43 Fake Ln, NotA
City, (Date) 1963-02-04, (String) pete@email.not, (String) Pete,
(BigDecimal) 1337]} [code=1400, state=23000]
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:866)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1421)
Truncated. see log file for complete stacktrace
请注意,代码试图插入5个值,而需要6个值-缺少ID
DAO代码如下所示:
INSERT INTO addr_proj VALUES
(
addr_seq.nextval,
'Matt',
'3 Fake Ave, Madeuptown',
'01-apr-1980',
'matt@madeupemail.com',
'1234'
);
void add(AddrProj item) {
em.persist(item);
}
是什么导致了这个问题
在实体类中是否需要setId(long)
方法
我是否需要DAO的add()
方法中的特殊代码来管理
序列发生器
我还缺什么吗
注意:这是家庭作业,但我选择尝试使用自动生成的主键有点超出了作业的范围。本课程未涉及该内容。删除@Column(insertable=false,updateable=false),该列将成为插入和更新的一部分
查看jpa hibernate注释文档“2.2.2.3.声明列属性”一节