生成的序列未在EJB中填充

时间:2012-12-11 14:57:14

标签: caching jpa eclipselink sequence persist

我有一个使用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的逻辑看起来像这样:

    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值仍为null。

我尝试了一个简单的解决方法,通过丢弃原始对象并查询新对象(基于fileId是代理键的列的唯一组合),我想我必须得到一个缓存对象,因为我还在使用null fileId获取EJB实例。

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

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

我目前正在考虑使此对象的缓存失效,然后重新加载它,但这似乎是一个糟糕的问题。从我读到的JPA开始,这应该可以正常运行。

任何建议都会受到最高的赞赏。

史蒂夫

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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