JPA – 在persist()之后返回一个自动生成的id

我正在使用JPA(EclipseLink)和Spring。 说我有一个自动生成的ID简单的实体:

@Entity public class ABC implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; // ... } 

在我的DAO类中,我有一个调用此实体上的persist()的插入方法。 我想要的方法返回为新的实体生成的ID,但是当我testing它,而不是返回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只能保证在冲洗时生成。 坚持一个实体只是使其“附加”到持久化上下文。 所以,要么直接刷新实体pipe理器:

 em.persist(abc); em.flush(); return abc.getId(); 

或返回实体本身而不是其ID。 当事务结束时,刷新将会发生,事务之外的实体的用户将看到实体中生成的ID。

 @Override public ABC addNewABC(ABC abc) { abcDao.insertABC(abc); return abc; } 
 @Entity public class ABC implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; } 

请检查您的实体类中是否存在@GeneratedValue注释。这会告诉JPA您的实体属性自动生成的行为

你也可以使用GenerationType.TABLE,而不是IDENTITY,只有在插入后才可用。

这是我做到的:

 EntityManager entityManager = getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); entityManager.persist(object); transaction.commit(); long id = object.getId(); entityManager.close(); 
 em.persist(abc); em.refresh(abc); return abc;