java - 使用 JPA 和自动生成的主键在数据库中创建条目

标签 java jpa jakarta-ee

我是一名 Java EE/JPA 新手,目前正在参加 Java EE 编程初学者类(class)。

我正在尝试在数据库中创建新条目,该数据库具有定义的序列 生成一个ID,该ID将用作主键。

这是 Eclipse 从数据库表生成的实体:

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

但是,当我尝试通过 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 代码看起来像这样:

void add(AddrProj item) {
    em.persist(item);
}

是什么导致了这个问题?

我的实体类中需要 setId(long) 方法吗?

我是否需要在 DAO 的 add() 方法中添加特殊代码来管理 序列生成器?

我还漏掉了什么吗?

注意:这是家庭作业,但我选择尝试使用自动生成的主键有点超出了作业的范围。类(class)中未涉及此内容。

最佳答案

删除@Column(insertable = false, updatable = false),该列将成为插入和更新的一部分。

查看jpa hibernate注释文档部分“2.2.2.3.声明列属性”。

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

insertable (optional): whether or not the column will be part of the insert statement (default true)
updatable (optional): whether or not the column will be part of the update statement (default true)

关于java - 使用 JPA 和自动生成的主键在数据库中创建条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419683/

相关文章:

java - 按名字或姓氏以及特定的相关 ID 搜索?

java - EntityManagerProvider 被注入(inject)为 null

java - 在java中打印单独的名称变体?

java - 按钮未更新其文本

java - 通过SSL通过Cajo连接时出现javax.net.ssl.SSLHandshakeException

mysql - 当持久化实体之间具有一对一关系时,JPA 会出现 Hibernate 问题

java - hibernate Java 10

java - 使用 jQuery 通过 POST 向 java 方法发送和接收数据

jsf - Bean 验证 VS JSF 验证

java - JAXB 没有整理我的列表