Hibernate – 更新表中的主键“id”列

在我的Java应用程序中,我使用hibernate .hbm文件来访问数据库; 这是否可以更新表中的主键’id’列; 我的.hbm文件中的’id’列如下:

           

尝试这个:

 String hql="update table set id=? where id=? "; Query query=HibernateSessionFactory.getSession().createQuery(hql); query.setInteger(0,1); query.setInteger(1,2); query.executeUpdate(); HibernateSessionFactory.getSession().beginTransaction().commit(); 

或者只是使用sql:

 String sql = "update table set id = ? where id= ?" Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); query.setParameter(0, 1); query.setParameter(1, 2); 

不.Hibernate不允许更改主键。 通常,如果需要更改主键值,则主键值不应更改,而主键列不是主键的良好候选者。

如果您希望通过实体而不是查询进行更新,则有一种解决方法:

 1) clone the entity to a new entity. 2) delete the old entity. (be careful of your cascade children entities) 3) change the primary key of new entity (or set it null depend your generation strategy). 4) save the new entity. 

在hibernate中, id列自动递增,而session.save()则根据您使用的生成策略执行。 查看这篇文章的简单示例

尝试编写类似的查询

update table_name set id=value where ……………(指定剩余条件)

基本上,Hibernate不允许更新或更改数据库实体的主键。 原因是您通过某些查询或.get或.load方法从数据库中获取的实体数据进入持久上下文层。 因此,从hibernate角度来看,更新此类持久性实体对象意味着从数据库中删除旧版本并创建新数据库。
最好像普通的更新查询一样

 Query query=HibernateSessionFactory.getSession().createQuery(update table set id=? where id=?); query.executeUpdate(); HibernateSessionFactory.getSession().beginTransaction().commit(); 
Interesting Posts