我使用的是JPA (EclipseLink)和Spring。假设我有一个简单的实体,它有一个自动生成的ID:
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}在我的DAO类中,我有一个insert方法,它在这个实体上调用persist()。我希望该方法返回为新实体生成的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);
}
}发布于 2012-03-16 16:27:03
ID仅保证在刷新时生成。持久化实体只会使其“附加”到持久化上下文。所以,要么显式地刷新实体管理器:
em.persist(abc);
em.flush();
return abc.getId();或者返回实体本身而不是其ID。当事务结束时,将发生刷新,因此事务之外的实体的用户将在实体中看到生成的ID。
@Override
public ABC addNewABC(ABC abc) {
abcDao.insertABC(abc);
return abc;
}发布于 2016-04-11 18:21:09
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
}检查@GeneratedValue表示法在您的实体中是否存在class.This告诉JPA您的实体属性自动生成的行为
发布于 2015-08-11 22:46:45
我是这样做的:
EntityManager entityManager = getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(object);
transaction.commit();
long id = object.getId();
entityManager.close();https://stackoverflow.com/questions/9732453
复制相似问题