我正在使用JPA(EclipseLink)和Spring。假设我有一个带有自动生成ID的简单实体:
@Entity
public 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);
}
}
答案 0 :(得分:151)
只保证在刷新时生成ID。持久化实体只会使其“附加”到持久化上下文。因此,要么明确地刷新实体管理器:
em.persist(abc);
em.flush();
return abc.getId();
或返回实体本身而不是其ID。当事务结束时,将发生刷新,因此事务外部的实体用户将在实体中看到生成的ID。
@Override
public ABC addNewABC(ABC abc) {
abcDao.insertABC(abc);
return abc;
}
答案 1 :(得分:10)
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
}
检查实体类中是否存在@GeneratedValue表示法。这告诉JPA您的实体属性自动生成的行为
答案 2 :(得分:3)
我就这样做了:
Map<*MyCodecInfoClass*, Codec>
答案 3 :(得分:2)
你也可以使用GenerationType.TABLE而不是IDENTITY,它只能在插入后使用。
答案 4 :(得分:0)
与4.0兼容的另一个选项:
在提交更改之前,您可以从与上下文关联的集合中恢复新的with open("C:\MXD\dataSources.csv") as csvfile:
pathList = csvfile.readlines()
vendMastList = ["Vendor", "vendor", "master", "Master"]
for pth in pathList:
for vendMast in vendMastList:
if vendMast not in pth:
print pth
对象,如下所示:
CayenneDataObject
然后访问集合中每个集合的CayenneDataObject dataObjectsCollection = (CayenneDataObject)cayenneContext.newObjects();
,例如:
ObjectId
最后,您可以在这些值下进行迭代,其中通常generate_id将是ObjectId objectId = dataObject.getObjectId();
返回的Map中的第一个值(对于单个列键),与PK关联的名称作为键:
getIdSnapshot()
答案 5 :(得分:0)
这就是我的方法。你可以尝试
public class ABCService {
@Resource(name="ABCDao")
ABCDao abcDao;
public int addNewABC(ABC abc) {
ABC.setId(0);
return abcDao.insertABC(abc);
}
}
答案 6 :(得分:-2)
em.persist(abc);
em.refresh(abc);
return abc;