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

时间:2013-03-21 05:04:57

标签: java hibernate hbm

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

<hibernate-mapping package="org.jems.user.model">
<class name="Student_Details" table="t_student">
<id name="id" type="int" column="id">
<generator class="increment"/>
</id>
<property name="name" column="name" type="string" unique="true" not-null="true" />
<property name="description" column="description" type="string"  />
<property name="comments" column="comments" type="string"  />
<property name="active"     column="isActive"   type="boolean"  not-null="true" />
</class>
</hibernate-mapping>

6 个答案:

答案 0 :(得分:6)

试试这个:

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);  

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

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.

答案 3 :(得分:0)

在休眠id中,根据您使用的生成策略,session.save()执行{{1}}时会自动增加列值。查看this帖子以获取简单示例

答案 4 :(得分:0)

尝试编写像

这样的查询

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

答案 5 :(得分:0)

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

那样进行正常的更新查询
Query query=HibernateSessionFactory.getSession().createQuery(update table set id=? where id=?);
query.executeUpdate();
HibernateSessionFactory.getSession().beginTransaction().commit();
相关问题