gpt4 book ai didi

java - 当 ID 为 null 并在数据库中自动生成时持久化实体

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:28 26 4
gpt4 key购买 nike

我将 EclipseLink 与 JavaDB 一起使用,每次我尝试保留新用户实体时,我都会收到与新用户实体的 ID 字段为空这一事实相关的错误。我知道它是空的——这应该是因为 ID 字段是作为数据库中的身份生成的。还是我错了?我已经尝试将 @GeneratedValue 添加到实体,但无论使用何种生成策略,都会导致错误。我也看过 here , here , 和 here但这些问题似乎与我的问题并不完全相关。下面的异常总是在调用 EntityManager.persist(user) 时发生。

我还尝试删除@NotNull 和@GeneratedValue,奇怪的是,它通过了持久调用——但只是在提交时失败。据我所知,我已经把一切都设置好了。所以问题是:为什么这个应用程序无法添加新用户,我需要做什么来修复它?

用户实体:

 @Entity(name = "User")
@Table(name = "USERS")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "IDENTIFIER", nullable = false,unique = true)
private Long identifier;
// class shortened for brevity
}

对应这个SQL脚本:

create table "USERSDBADMIN".USERS
(
IDENTIFIER BIGINT not null primary key GENERATED ALWAYS AS IDENTITY
(START WITH 0, INCREMENT BY 1),
USERNAME VARCHAR(50) not null,
EMAIL VARCHAR(150) not null,
LASTLOGIN DATE default NULL
);

用户创建方法(来自 JPA Controller ):

public void create(User user) throws PreexistingEntityException, RollbackFailureException, Exception {
EntityManager em = null;
try {
utx.begin();
em = getEntityManager();
em.persist(user);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception re) {
throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
}
if (findUser(user.getIdentifier()) != null) {
throw new PreexistingEntityException("User " + user + " already exists.", ex);
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}

GenerationStrategy.Identity 错误(基本上是说 ID 字段为空):

ex = (javax.validation.ConstraintViolationException) javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.

GenerationStrategy.Sequence 错误(Table 和 Auto 产生相同的异常):

ex = (org.eclipse.persistence.exceptions.DatabaseException) Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException. Internal Exception: java.sql.SQLSyntaxErrorException: SEQUENCE 'SEQ_GEN_SEQUENCE' does not exist. Call: VALUES(NEXT VALUE FOR SEQ_GEN_SEQUENCE) Query: ValueReadQuery(sql="VALUES(NEXT VALUE FOR SEQ_GEN_SEQUENCE)")

最佳答案

不要对使用GenerationType.IDENTITY 策略生成的@Id 属性使用@NotNull 约束。问题是 @NotNull 和其他 JSR-303 约束在提交之前被验证。直到提交完成后,自动递增的标识符才可用。

试试这个,不再关心 ID 初始化:

 @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "IDENTIFIER", nullable = false, unique = true)
private Long identifier;

关于java - 当 ID 为 null 并在数据库中自动生成时持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com