有3张表 
nuser表代表用户表,id为主键,自增.其中有个username的字段. 
shenfenzheng代表身份证表.id为主键,自增.里面有shenfenzhenghao字段代表身份证号,userid代表关联到nuser表的id,外键, 
还有个dingdan表代表定单表,id为主键,自增.里面有个dingdanhao字段,有个userid字段关联到nuser表的id,外键. 这个关系是nuser表和shenfenzheng表是一对一关系,nuser和dingdan是一对多关系,程序代码如下//删除的类
public class DeleteUser
{
public void deleteUser(Integer id)
{
Session session=CreateSession.createSession();
Nuser nuser=(Nuser) session.get(Nuser.class, id);
//Hibernate.initialize(nuser.getDingdan());
Transaction tx=null;
try
{
tx=session.beginTransaction();
session.delete(nuser);
session.flush();
tx.commit();
}
catch(Exception e)
{
if(tx!=null)
tx.rollback();
System.out.println(e.getMessage());
}
finally{
session.close();
}
}
}
<hibernate-mapping>
    <class name="databasepo.Nuser" table="nuser" catalog="hibernate">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <property name="username" type="java.lang.String">
            <column name="username" length="20" not-null="true" />
        </property>
        <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/>
        <set name="dingdan" order-by="id" cascade="delete">
        <key column="userid"/>
        <one-to-many class="databasepo.Dingdan"/>
        </set>
    </class>
</hibernate-mapping><hibernate-mapping>
    <class name="databasepo.Dingdan" table="dingdan" catalog="hibernate">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <property name="userid" type="java.lang.Long">
            <column name="userid" not-null="true" />
        </property>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="databasepo.Shenfenzheng" table="shenfenzheng" catalog="hibernate">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <property name="shenfenzhenghao" type="java.lang.String">
            <column name="shenfenzhenghao" length="20" not-null="true" />
        </property>
        <many-to-one name="nuser" class="databasepo.Nuser" unique="true" column="userid"/>
    </class>
</hibernate-mapping>
执行的时候删除数据的日志如下
Hibernate: select nuser0_.id as id0_1_, nuser0_.username as username0_1_, shenfenzhe1_.id as id2_0_, shenfenzhe1_.shenfenzhenghao as shenfenz2_2_0_, shenfenzhe1_.userid as userid2_0_ from hibernate.nuser nuser0_ left outer join hibernate.shenfenzheng shenfenzhe1_ on nuser0_.id=shenfenzhe1_.userid where nuser0_.id=?
Hibernate: select dingdan0_.userid as userid1_, dingdan0_.id as id1_, dingdan0_.id as id1_0_, dingdan0_.userid as userid1_0_ from hibernate.dingdan dingdan0_ where dingdan0_.userid=? order by dingdan0_.id
Hibernate: update hibernate.dingdan set userid=null where userid=?
Could not execute JDBC batch update
Could not execute JDBC batch update.这个是怎么回事呢?

解决方案 »

  1.   

    你在这几个*.hbm.xml文件中的一对多,一对一中加上lazy="false"就可以了
       <class name="databasepo.Nuser" table="nuser" catalog="hibernate"> 
             <id name="id" type="java.lang.Integer"> 
                 <column name="id" /> 
                 <generator class="native"> </generator> 
             </id> 
             <property name="username" type="java.lang.String"> 
                 <column name="username" length="20" not-null="true" /> 
             </property> 
             <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/> 
             <set name="dingdan" order-by="id" cascade="delete"> //   <class name="databasepo.Nuser" table="nuser" catalog="hibernate"> 
             <id name="id" type="java.lang.Integer"> 
                 <column name="id" /> 
                 <generator class="native"> </generator> 
             </id> 
             <property name="username" type="java.lang.String"> 
                 <column name="username" length="20" not-null="true" /> 
             </property> 
             <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/> 
             <set name="dingdan" order-by="id" cascade="delete"> 
             <key column="userid"/> 
             <one-to-many class="databasepo.Dingdan"/> 
             </set> 
         </class>          <key column="userid"/> 
             <one-to-many class="databasepo.Dingdan"/> 
             </set> 
         </class> 
    红色delete最好换成all ,因为,如果用户都不存在了,身份证与订单也就没有了
      

  2.   

    你在这几个*.hbm.xml文件中的一对多,一对一中加上lazy="false"就可以了
       <class name="databasepo.Nuser" table="nuser" catalog="hibernate"> 
             <id name="id" type="java.lang.Integer"> 
                 <column name="id" /> 
                 <generator class="native"> </generator> 
             </id> 
             <property name="username" type="java.lang.String"> 
                 <column name="username" length="20" not-null="true" /> 
             </property> 
             <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/> 
             <set name="dingdan" order-by="id" cascade="delete"> //   <class name="databasepo.Nuser" table="nuser" catalog="hibernate"> 
             <id name="id" type="java.lang.Integer"> 
                 <column name="id" /> 
                 <generator class="native"> </generator> 
             </id> 
             <property name="username" type="java.lang.String"> 
                 <column name="username" length="20" not-null="true" /> 
             </property> 
             <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/> 
             <set name="dingdan" order-by="id" cascade="delete"> 
             <key column="userid"/> 
             <one-to-many class="databasepo.Dingdan"/> 
             </set> 
         </class>          <key column="userid"/> 
             <one-to-many class="databasepo.Dingdan"/> 
             </set> 
         </class> 
    红色delete最好换成all ,因为,如果用户都不存在了,身份证与订单也就没有了
      

  3.   

    你在这几个*.hbm.xml文件中的一对多,一对一中加上lazy="false"就可以了 
       <hibernate-mapping> 
         <class name="databasepo.Nuser" table="nuser" catalog="hibernate"> 
             <id name="id" type="java.lang.Integer"> 
                 <column name="id" /> 
                 <generator class="native"> </generator> 
             </id> 
             <property name="username" type="java.lang.String"> 
                 <column name="username" length="20" not-null="true" /> 
             </property> 
             <one-to-one name="shenfenzheng" class="databasepo.Shenfenzheng" cascade="all" property-ref="nuser"/> 
             <set name="dingdan" order-by="id" cascade="delete"> 
             <key column="userid"/> 
             <one-to-many class="databasepo.Dingdan"/> 
             </set> 
         </class> 
    </hibernate-mapping>         红色delete最好换成all ,因为,如果用户都不存在了,身份证与订单也就没有了 
    上面那个复制错了
      

  4.   

    换成all的时候我添加用户的时候是不添加定单的.如果这样只添加用户和身份证会报错的.怎么办呢?
      

  5.   

    加上lazy="false"了后删除也还是报那个错.
      

  6.   

    眼神儿没那么差吧?人家让你加cascade,你来了句"加上lazy="false"了后..."
      

  7.   

    他第一句不就是
    你在这几个*.hbm.xml文件中的一对多,一对一中加上lazy="false"就可以了  
    这样写的吗?
      

  8.   

    在Nuser.hbm.xml的one-to-many中加inverse=true,另一个加inverse=false
      

  9.   

    我用的是单向关联,如果inverse=true了后不是没控制方了吗?