我有一个使用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开始,这应该可以正常运行。
任何建议都会受到最高的赞赏。
史蒂夫
答案 0 :(得分:0)
EclipseLink将在用于SEQUENCE生成的persist()调用上分配id值。对于IDENTITY生成,在刷新或提交之前不能分配它。
您应该在持续通话后看到该值。你有任何错误吗?你有一个@NotNull验证约束,这可能会导致错误。尝试在持久调用后打印id的值。
答案 1 :(得分:0)
我最终不得不做一个提交对象的暴力工作,然后从头开始重新实例化。它不漂亮,但它的工作原理。我仍然无法解释为什么它不遵守JPA生成的序列的记录行为。它可能是EclipseLink 2.4.0中的一个错误,但我还没有验证这一点。