说明你表中的主键已经设定为标志列,那么在映射文件的时候就不能再设定为increment,改过来就可以了,如果修改表后还不行,那么删掉映射文件重新映射。

解决方案 »

  1.   

    这个问题表示你的表的主键没有设置为自动增长列,那么:只能设置为increment类型
    <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment"></generator>
            </id>
      

  2.   

    我没怎么用过SQLServer 2000,我想是这样,它的意思是说该id已经设置为数据库内部的自增型类型,因此在插入数据时不需要你指定该值,它不能设置为你给它赋予的值。
        这是由于你在映射one-to-one关联时用了共同的主键,想象一下应该是这样:hibernate首先往数据库中插入主表的数据,该id由数据库产生,然后hibernate将该id值取出作为从表的id值,这样才能实现主从表的对应关系,再往数据库中插入从表数据,然后自然就出现上面的错误了。
        你可以改变id的生成方式,数据库中从表的id字段不用指定为内部自增型。(试一下)
        或者id由hibernate自动产生,如uuid类型。
        或者主从表不要用共同的主键,改变映射方式类似如下:
    <class name="Person">
        <id name="id" column="personId">
            <generator class="native"/>
        </id>
        <many-to-one name="address" 
            column="addressId" 
            unique="true"
            not-null="true"/>
    </class><class name="Address">
        <id name="id" column="addressId">
            <generator class="native"/>
        </id>
       <one-to-one name="person" 
            property-ref="address"/>
    </class>
    这是hibernate参考中推荐的方法之一,address为主,person为从,id由数据库产生。
      

  3.   

    那也要看他提供的一些资料啊,他表里没设置自动增长列,所以那里面要让他自动增长的话,Hibernate就要设置为increment类型
      

  4.   

    如果这两张表不是紧耦合,不建议使用一对一.最好写成一对多.因为一对多时,lazy始终是false