如果order中只有一个item则没问题,超过两个就会重复tb_item的主键!当然一开始tb_item中没有数据时也是可以写入的,无论item的个数是多少,真奇怪!请指点!

解决方案 »

  1.   

    我想问题原因是不是在于你所查看的并不是tb_item的id(主键)呢?
    而是你把item的orderid当作tb_item的id了。我觉得这样是合理的解释。因为你插入的是一个order对象以及它的item集合,
    那么这些item有相同的orderid ,也就是那个外键,也就是这个order对象的id.
    你看到的是这些orderid当然是一样的,重复的,而不是自增长的了。或许你建数据表的时候就没正确,请照这个思路检查。
      

  2.   

    谢谢您的回复!数据库建表没问题!id是tb_item的主键,orderid是外键。
    问题是如果tb_item一开始空的时候,我是可以写入多个item的,当然,它们的orderid都是一样的,所以困惑了。而且插入一个的话,tb_item的id也是增长的。MyEclipse中的提示是:
    Caused by: java.sql.BatchUpdateException: Duplicate entry '3' for key 1
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:648)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
    ... 36 more
    请指点!
      

  3.   

    我用了你和差不多的程序没发现有什么问题么。请看我的配置和代码。<?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="cn.nuaa.vo.Event" table="event" catalog="test" lazy="false">
            <id name="id" type="java.lang.Integer" >
                <column name="id" />
                <generator class="native" />
            </id>
            <property name="topic" type="java.lang.String">
                <column name="topic" length="20" />
            </property>
            <set name="speakers" inverse="false" cascade="save-update" lazy="false" outer-join="true" >
                <key>
                    <column name="event_id" not-null="true" />
                </key>
                <one-to-many class="cn.nuaa.vo.Speaker" />
            </set>
        </class>
    </hibernate-mapping><?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="cn.nuaa.vo.Speaker" table="speaker" catalog="test">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="native" />
            </id>
            <many-to-one name="event" class="cn.nuaa.vo.Event" fetch="select" cascade="save-update"  outer-join="true"
            >
                <column name="event_id" not-null="true" />
            </many-to-one>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" />
            </property>
        </class>
    </hibernate-mapping>
    package cn.nuaa.service;import java.io.UnsupportedEncodingException;
    import java.util.Iterator;
    import java.util.List;import hbm.HibernateSessionFactory;
    import org.hibernate.Criteria;
    import org.hibernate.Hibernate;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.criterion.Expression;import cn.nuaa.dao.TestDAO;
    import cn.nuaa.vo.Event;
    import cn.nuaa.vo.Speaker;/**
     * @author Administrator
     * 
     */
    public class TestService
    { public static void main(String[] args) throws UnsupportedEncodingException
    { Event e = new  Event();
    Speaker s1 = new Speaker() ;
    Speaker s2 = new Speaker() ;
    s1.setName("111") ;
    s2.setName("222") ;
    s1.setEvent(e) ;
    s2.setEvent(e) ;
    e.setTopic("java") ; 

    e.getSpeakers().add(s1) ;
    e.getSpeakers().add(s2) ; Session session = HibernateSessionFactory.getSession();
    Transaction tx = session.beginTransaction();

    session.save(e) ;   //这样相应的speakers会被保存,id是连续增长的2个
    tx.commit();
    session.close(); }}
      

  4.   

    在数据库中不用设定主键为"自动增加",直接设定其为主健就可以了,在hibernate中设置主健方式,其中也有自动增加和自动创建16位和32位的字符主健,
      

  5.   

    <id name="orderID" > 
    <generator class="native"/ > 
    </id >
    改成
    <id name="orderID" > 
    <column name="orderid"/>
    <generator class="native"/ > 
    </id >
      

  6.   

    一般mysql中主键不用设自动增加,利用myeclipse的Datebase Explorer自动生成hbm.xml然后修改<generator class="自己的"/  >  
      

  7.   

    7楼的这话好象说的不对,为什么不用mysql提供的id生成策略呢?
      

  8.   

    <generator class="increment"/ >