Item和Subitem是一对多关系
Item.hbm.xml<hibernate-mapping>
    <class name="com.hibernate3.pojo.Item" table="item" catalog="mybbs">
        <id name="itemid" type="java.lang.Integer">
            <column name="itemid" />
            <generator class="increment" />
        </id>
        <property name="itemname" type="java.lang.String">
            <column name="itemname" length="50" not-null="true" />
        </property>
        <property name="itemcode" type="java.lang.String">
            <column name="itemcode" length="50" not-null="true" />
        </property>
     
        <set name="subitems" table="subitem" inverse="false" cascade="all">
        <key column="itemid"/>
        <one-to-many class="com.hibernate3.pojo.Subitem"/>        
        </set>
    
    </class>
</hibernate-mapping>
Subitem.hbm.xml

<hibernate-mapping>
    <class name="com.hibernate3.pojo.Subitem" table="subitem" catalog="mybbs">
        <id name="subid" type="java.lang.Integer">
            <column name="subid" />
            <generator class="increment"/>
        </id>
        <property name="subname" type="java.lang.String">
            <column name="subname" length="50" not-null="true" />
        </property>       
        <property name="subcode" type="java.lang.Integer">
            <column name="subcode" not-null="true" />
        </property>
        
        <many-to-one name="item" column="itemid" class="com.hibernate3.pojo.Item" fetch="select" />
    </class>
</hibernate-mapping>
Session s=HibernateSessionFactory.getSession();
Transaction t=s.beginTransaction();

//Item item=(Item)s.get(Item.class, 1);//根据主键从数据库获取Item对象
Item item=new Item();//自己生成Item对象 

//item.setItemid(1);

item.setItemname("department");
item.setItemcode("1");


Subitem subitem1=new Subitem();
subitem1.setSubname("et");
subitem1.setSubcode(2);


Subitem subitem2=new Subitem();
subitem2.setSubname("ecnomic");
subitem2.setSubcode(3);


Subitem subitem3=new Subitem();
subitem3.setSubname("manager");
subitem3.setSubcode(3);


Set subitems=new HashSet();
subitems.add(subitem1);
subitems.add(subitem2);
subitems.add(subitem3);

//System.out.println(subitems.size());
System.out.println(item.getItemid()+" "+item.getItemname());
item.setSubitems(subitems);

s.save(item);
t.commit();
s.close();
Hibernate: select max(itemid) from item
Hibernate: select max(subid) from subitem
Hibernate: insert into mybbs.item (itemname, itemcode, itemid) values (?, ?, ?)
Hibernate: insert into mybbs.subitem (subname, subcode, itemid, subid) values (?, ?, ?, ?)
Hibernate: insert into mybbs.subitem (subname, subcode, itemid, subid) values (?, ?, ?, ?)
Hibernate: insert into mybbs.subitem (subname, subcode, itemid, subid) values (?, ?, ?, ?)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
.....
Caused by: java.sql.BatchUpdateException: Column 'itemid' cannot be null
请指点一下错在哪?主键是怎样生成的?

解决方案 »

  1.   

    <generator class="native" />
    试试
      

  2.   

    能解决异常了,subitem表的itemid字段没有获得item表的id,所以为null报异常,所以必须加上subitem1.setItem(item);
    subitem2.setItem(item);
    subitem3.setItem(item);
    让subitem获得Item的字段
    但是不清楚的是通过item.hbm.xml的配置
            <set name="subitems" table="subitem" inverse="false" cascade="all"> 
            <key column="itemid"/> 
            <one-to-many class="com.hibernate3.pojo.Subitem"/>        
            </set> 
    inverse=false,是否item表会自己把它的id通过hibernate传给subitem?
    我这里出错是不是因为设置了双向关联?
      

  3.   


    <set name="subitems" table="subitem" inverse="false" cascade="all"> <!--应该是这里出了问题,怎么又多出个table??这是表明第3张表,应该是calss吧??-->
     <key column="itemid"/> 
     <one-to-many class="com.hibernate3.pojo.Subitem"/>        
    </set>