Parent.hbm.xml:
<class name="org.echo.hibernate.Parent" table="parent">
<id name="pid">
<column name="pid"></column>
<generator class="native">
</generator>
</id>
<property name="name"></property>
<set name="childs" inverse="true" cascade="all,delete-orphan">
<key column="pid"></key>
<one-to-many class="org.echo.hibernate.Child"/>
</set>
</class>Child.hbm.xml:
<class name="org.echo.hibernate.Child" table="child">
<id name="cid">
<column name="cid"></column>
<generator class="native">
</generator>
</id>
<many-to-one name="parent" column="pid" not-null="true"></many-to-one>
</class>
public void  testUpdateParent(){
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
Parent parent = (Parent)session.load(Parent.class, 26); 
parent.setPid(44);
session.save(parent);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtil.closeSession(session);
}
}我本来是想测一下级联,改动父对象的ID,然后引用的子对象的外键也变。但就报了org.hibernate.HibernateException:identifier of an instance of org.echo.hibernate.Parent  was altered from 26 to 44
网上找了找也没有发现找到答案。。我的疑问是hibernate 的自增长主键是否不能改。

解决方案 »

  1.   

    如果你用的数据库是Mysql的话,那么id的生成策略在Hibernate配置文件中的 generator class="native"代表的是auto_increment。
    如果有级联的话,你是不能单独改变其id值的。不然你可以去掉级联的关系,再改变id的值,然后加上住外键的关系就行了。
      

  2.   

    好像也是不可以的。我单独测了一下。child也是不能改他的id。我想自增长是不能改的。。也测试了一下新增加一个child,即使手动给一个id ,插入后也没有用手动给的id.
      

  3.   

    呵呵,这个贴子没有吸引力。。晚上就结贴吧。。第一次发贴。。感谢加贴的CSDNer..
      

  4.   

    自增长的话。是在数据库执行sql语句的时候,把自增的字段自动根据原则设值的。你传进去的值,数据库根本不予理会。所以是不能手动设置的