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;