我有一个使用 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 的了解,这应该可以按我的预期工作。
任何建议将不胜感激。
史蒂夫