6

在我的 Java 应用程序中,我使用休眠 .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>
4

6 回答 6

7

试试这个:

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);  
于 2013-03-21T05:14:31.110 回答
5

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

于 2013-03-21T05:14:56.070 回答
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.
于 2017-05-19T03:59:13.160 回答
0

在休眠时,列值会根据您使用的生成策略id自动递增。session.save()检查这篇文章以获得一个简单的例子

于 2013-03-21T05:10:57.697 回答
0

尝试编写查询

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

于 2013-03-21T05:15:55.753 回答
0

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

Query query=HibernateSessionFactory.getSession().createQuery(update table set id=? where id=?);
query.executeUpdate();
HibernateSessionFactory.getSession().beginTransaction().commit();
于 2013-12-27T11:13:21.707 回答