0

我有一个使用 Eclipselink 2.4.0 的应用程序,我已经开始使用生成的代理键。我的 EJB 注释如下所示:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "reformatFileId")
@SequenceGenerator(name = "reformatFileId", sequenceName = "REFORMAT_FILE_ID_SEQ", allocationSize = 1)
@Basic(optional = false)
@NotNull
@Column(name = "FILE_ID")
private Long fileId;

在实例化 EJB 后,我持久化 EJB 的逻辑如下所示:

    try {
        EntityManager em = getEntityManager();
        em.persist(entity);
        em.flush();
    } catch (ConstraintViolationException ex) {
        for (ConstraintViolation cv : ex.getConstraintViolations())
            LOGGER.log(Level.SEVERE, "Constraint violation persisting {0}: {1}", new Object[]{entity.getClass(), cv.getMessage()});
        throw ex;
    }

创建对象时,我需要立即获取 fileId 值,以便可以在使用 fileId 作为外键的子表中创建记录。但是,我发现 fileId 值仍然为空。

我尝试了一个简单的解决方法,丢弃原始对象并查询一个新对象(基于 fileId 是代理键的列的唯一组合),我认为我必须得到一个缓存对象,因为我' m 仍然得到一个具有空 fileId 的 EJB 实例。

我已经尝试更新到 Eclipselink 2.4.1,以防这是 ​​JPA 错误,但这并没有帮助。

我也尝试在我的提交逻辑中添加对 em.refresh(entity) 的调用,但我的理解是刷新作用于主键,所以可以理解的是,这并没有解决问题。

我目前正在研究使该对象的缓存无效,然后重新加载它,但这似乎是一个可怕的问题。根据我对 JPA 的了解,这应该可以按我的预期工作。

任何建议将不胜感激。

史蒂夫

4

2 回答 2

0

EclipseLink 将在persist() 调用上分配id 值以生成SEQUENCE。对于 IDENTITY 生成,在刷新或提交之前无法分配。

您应该在持久调用后看到该值。你有任何错误吗?您有一个 @NotNull 验证约束,这可能会导致错误。尝试在持久调用之后打印 id 的值。

于 2012-12-11T15:58:23.643 回答
0

我最终不得不对提交对象进行暴力解决,然后从头开始重新实例化它。它不漂亮,但它有效。我仍然无法解释为什么它不尊重 JPA 生成序列的记录行为。这可能是 EclipseLink 2.4.0 中的一个错误,但我还没有验证这一点。

于 2013-02-18T15:18:13.620 回答