JPA-在persist()之后返回自动生成的ID
我正在使用JPA(EclipseLink)和Spring。假设我有一个带有自动生成的ID的简单实体:
@Entitypublic class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}
在我的DAO类中,我有一个调用persist()
此实体的insert方法。我希望该方法为新实体返回生成的ID,但是当我对其进行测试时,它将返回0
。
public class ABCDao { @PersistenceContext
EntityManager em;
@Transactional(readOnly=false)
public int insertABC(ABC abc) {
em.persist(abc);
// I WANT TO RETURN THE AUTO-GENERATED ID OF abc
// HOW CAN I DO IT?
return abc.id; // ???
}
}
我还有一个包装DAO的服务类,如果有区别的话:
public class ABCService { @Resource(name="ABCDao")
ABCDao abcDao;
public int addNewABC(ABC abc) {
return abcDao.insertABC(abc);
}
}
回答:
该ID仅保证在刷新时生成。持久实体只会使它“附加”到持久性上下文。因此,要么显式刷新实体管理器:
em.persist(abc);em.flush();
return abc.getId();
或返回实体本身而不是其ID。当事务结束时,将发生刷新,事务外部实体的用户将因此在实体中看到生成的ID。
@Overridepublic ABC addNewABC(ABC abc) {
abcDao.insertABC(abc);
return abc;
}
以上是 JPA-在persist()之后返回自动生成的ID 的全部内容, 来源链接: utcz.com/qa/404249.html