我有A表和B表两个表,
B表引用了A表主键作为外键,
两个表的主键都不是序列,
我在hibernate配置主键id 时都设置成 <generator class="assigned" />
我在执行向B表添加一条记录的时候报了如下错误:
ERROR com.aptech.dao.TDeviceDAO - save failed
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.aptech.pojos.TDevice
请问该如何解决??

解决方案 »

  1.   

    ids for this class must be manually assigned在保存前要 手动指定主键id
      

  2.   

    hibernate配置主键id 时都设置成 <generator class="assigned" /> 需要保存对象的时候自己指定主键。
      

  3.   

    楼主 参考一下 http://blog.csdn.net/cRyIng_gG/archive/2007/03/05/1521300.aspx
      

  4.   

    是不是因为B中插入数据时引用了A中外键的那个字段在没A中不存在啊 
      

  5.   

    主键的assigned生成方式由程序自动生成表的主键,即在你的测试程序中要调用setId()方法,且必 
    须在调用save()前调用(或者说在调用save()前必须指定id,其实就是说,主键值不能为空!)。 
    把主键的生成方式改为native,它的特征是能够根据底层数据库自动选择主键生成方式。
      

  6.   

    你将<generator class="assigned" />
    中的assigned换成native
    顶9楼   
      

  7.   

    B表引用了A表主键作为外键
    B表的主键就不能设成<generator class="assigned" /> 
    插入时自己指定主键
      

  8.   

    hibernate配置主键id 时都设置成 <generator class="assigned" /> 需要保存对象的时候自己指定主键
      

  9.   

    我用的是Oracle数据库,设置成native同样不可以,为了更好的说明,我把两个表的配置粘贴如下:
    A表:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.aptech.pojos.Zonghe1" table="ZONGHE1" schema="SCOTT">
            <id name="FGoodsId" type="java.lang.String">
                <column name="F_GOODS_ID" length="20" />
                <generator class="assigned" />
            </id>
            <property name="FGoodsName" type="java.lang.String">
                <column name="F_GOODS_NAME" length="50" />
            </property>
            <property name="FPrice" type="java.lang.Double">
                <column name="F_PRICE" scale="4" />
            </property>
            <property name="FCount" type="java.lang.Long">
                <column name="F_COUNT" precision="22" scale="0" />
            </property>
            <property name="FRe" type="java.lang.String">
                <column name="F_REMARK" length="100" />
            </property>
            <set name="TDevices" inverse="true">
                <key>
                    <column name="F_GOODS_ID" length="20" />
                </key>
                <one-to-many class="com.aptech.pojos.TDevice" />
            </set>
        </class>
    </hibernate-mapping>B表:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.aptech.pojos.TDevice" table="T_DEVICE" schema="SCOTT">
            <id name="TId" type="java.lang.String">
                <column name="T_ID" length="20" />
                <generator class="assigned" />
            </id>
            <many-to-one name="zonghe1" class="com.aptech.pojos.Zonghe1" fetch="select">
                <column name="F_GOODS_ID" length="20" />
            </many-to-one>
            <property name="TName" type="java.lang.String">
                <column name="T_NAME" length="20" />
            </property>
            <property name="TPrice" type="java.lang.Double">
                <column name="T_PRICE" precision="18" scale="1" />
            </property>
            <property name="TFrom" type="java.lang.String">
                <column name="T_FROM" length="100" />
            </property>
        </class>
    </hibernate-mapping>