我的测试类代码如下:package cn.nit.action;import java.util.ArrayList;
import java.util.Iterator;import org.hibernate.HibernateException;
import org.hibernate.Session;import cn.nit.Convert.StringToDate;
import cn.nit.dao.KttypeDAO;
import cn.nit.dao.KttypeDAOImpl;
import cn.nit.hibernateORM.Kt;
import cn.nit.hibernateORM.Ktperson;
import cn.nit.hibernateORM.KtpersonType;
import cn.nit.hibernateORM.Kttype;
import cn.nit.hibernateORM.PersonOrder;
import cn.nit.hibernateUtil.HibernateSessionFactory;public class TestMain {
public static void main(String args[]){
Kt kt = null;
Ktperson ktPerson = null;
Kttype ktType = null;
PersonOrder personOrder = null;
KtpersonType ktPersonType = null;
String Date = "2009-01-01";

Session session = null;
KttypeDAO ktTypeDAO = new KttypeDAOImpl();
try{
session = HibernateSessionFactory.getSession();
session.beginTransaction();
System.out.println("开始插入数据库");

ktType = new Kttype();
//在KTType表对应的POJO类插入相关数据                   String sql = "from Kttype as ktType where ktType.typeNo='3'";
ArrayList ktTypelist = ktTypeDAO.doSelectKttypeDataFromDB(sql);
ktType.setTypeNo(new Integer("3"));//设置课题类型号,TypeNo是表KTType的主键 for(Iterator it = ktTypelist.iterator(); it.hasNext();){
Kttype ktType1 = (Kttype)it.next();
ktType.setTypeName(ktType1.getTypeName());//设置课题类型名
ktType.setStatus(ktType1.getStatus());//设置课题类型是否有效
}

kt = new Kt();
//在KT表对应的POJO类中插入相关数据                   kt.setKtname("你好");
kt.setBeginDate((new StringToDate()).ConverDate(Date,
"yyyy-MM-dd"));
kt.setEndDate((new StringToDate()).ConverDate(Date,
"yyyy-MM-dd"));
kt.setActEndDate((new StringToDate()).ConverDate(Date,
"yyyy-MM-dd"));
kt.setSbDate((new StringToDate()).ConverDate(Date,
"yyyy-MM-dd"));
kt.setAmtFrom("省级");
kt.setAmt(new Double(0.2));
kt.setSchoolAmt(new Double(0.2));
kt.setReimbursedAmt(new Double(0.0D));
kt.setReimbursed(false);
kt.setApproved(false);
kt.setAward(false);
kt.setFrozen(false);
kt.setDescription("描述中...");
kt.setStatus(new Integer("1"));//申报课题都是默认都设为"1",管理员需要添加的标志;
//设置双向关联
//为课题设置课题类型
kt.setKttype(ktType);//插入课题类型号

ktPersonType = new KtpersonType();
//在KTTpersonType表对应的POJO类插入相关数据                   ktPersonType.setTypeName("主持");
ktPersonType.setTypeNo(new Integer("1"));

personOrder = new PersonOrder();
//在PersonOrder表对应的POJO类插入相关数据                    personOrder.setOrderName("第一");
personOrder.setOrderNo(new Integer("1"));

ktPerson = new Ktperson();
//在KTPerson表对应的POJO类插入相关数据                   ktPerson.setPersonName("2");//先将课题主持人插入数据库
ktPerson.setPersonDeptName("计算机科学与技术系");
//为ktPerson设置...
ktPerson.setKt(kt);
ktPerson.setKtpersonType(ktPersonType);
ktPerson.setPersonOrder(personOrder); //为kt,ktPersonType,personOrder添加ktPerson
kt.getKtpersons().add(ktPerson);
ktPersonType.getKtpersons().add(ktPerson);
personOrder.getKtpersons().add(ktPerson);

session.save(ktType);//程序执行到这就跳转到catch那了。
//session.flush();
session.beginTransaction().commit();
}catch(HibernateException e){
System.out.println("hibernateException出错了");
session.beginTransaction().rollback();
}finally{
HibernateSessionFactory.closeSession();
}
}
}其中共有五个表:KT , KTType , KTPerson , PersonOrder , KTPersonTypeKT   与  KTType   存在多对一的关系KT   与   KTPerson 存在一对多的关系PersonOrder 与   KTPerson  存在一对多的关系KTPersonType   与   KTPerson   存在一对多的关系POJO类中的部分属性说明:KT.java     ....
     private Kttype kttype;
     private Set ktpersons = new HashSet(0) ;
     //set,get就不写了KT.hbm.xml     <many-to-one name="kttype" class="cn.nit.hibernateORM.Kttype" fetch="select" cascade="all">
            <column name="KTTypeNo" not-null="true" />
     </many-to-one>
     <set name="ktpersons" inverse="true">
            <key>
                <column name="KTNo" not-null="true" />
            </key>
            <one-to-many class="cn.nit.hibernateORM.Ktperson" />
     </set>
KTType.java     private Set kts = new HashSet(0);KTType.hbm.xml        <set name="kts" inverse="true">
            <key>
                <column name="KTTypeNo" not-null="true" />
            </key>
            <one-to-many class="cn.nit.hibernateORM.Kt" />
        </set>
PersonOrder.java    private Set ktpersons = new HashSet(0);PersonOrder.hbm.xml    <set name="ktpersons" inverse="true">
            <key>
                <column name="PersonOrderNo" not-null="true" />
            </key>
            <one-to-many class="cn.nit.hibernateORM.Ktperson" />
    </set>
KTPersonType.java    private Set ktpersons = new HashSet(0);KTPersonType.hbm.xml    <set name="ktpersons" inverse="true">
            <key>
                <column name="PersonTypeNo" not-null="true" />
            </key>
            <one-to-many class="cn.nit.hibernateORM.Ktperson" />
    </set>
KTPerson.java    private PersonOrder personOrder;
    private Kt kt;
    private KtpersonType ktpersonType;KTPerson.hbm.xml    <many-to-one name="personOrder" class="cn.nit.hibernateORM.PersonOrder" fetch="select" cascade="all" insert="false" update="false">
    <column name="PersonOrderNo" not-null="true" />
    </many-to-one>
    <many-to-one name="kt" class="cn.nit.hibernateORM.Kt" fetch="select">
<column name="KTNo" not-null="true" />
    </many-to-one>
    <many-to-one name="ktpersonType"
class="cn.nit.hibernateORM.KtpersonType" fetch="select" cascade="all" insert="false" update="false">
<column name="PersonTypeNo" not-null="true" />
    </many-to-one>
在做插入的时候,按照上面插入的话,就是这段代码:ktType = new Kttype();
//在KTType表对应的POJO类插入相关数据
         String sql = "from Kttype as ktType where ktType.typeNo='3'";
ArrayList ktTypelist = ktTypeDAO.doSelectKttypeDataFromDB(sql);
ktType.setTypeNo(new Integer("3"));//设置课题类型号
for(Iterator it = ktTypelist.iterator(); it.hasNext();){
         Kttype ktType1 = (Kttype)it.next();
         ktType.setTypeName(ktType1.getTypeName());//设置课题类型名
ktType.setStatus(ktType1.getStatus());//设置课题类型是否有效
}
这个是不是有问题。其实我的表KTType是有数据的,KTType表中的数据有几条件固定的记录,但是因为 KT表有KTType的字段,也就是它的主键,所以我用了ktType.setTypeNo(new Integer("3");;其它的表像PersonOrder, KTPersonType, 这两个表也是有几个固定的记录的,其实数据只是插入到KT , KTPerson中去,只不过跟它们相关联了;插入数据是不是我上面的那种做法?可能有些人说叫我去看看一下书,叫我看书是没错,但是这种东西要真真的操作的时候才会发现问题所在!

解决方案 »

  1.   

    说错了,应该是多表插入,session.save()不能执行.
      

  2.   

    没错误信息。只是跳转到catch那了,本来想继续跟踪下去的,可是发现没类的源文件,跟踪不下去。但是输出了System.out.println("hibernateException出错了");
    要有错误报告我都高兴了.
      

  3.   

    这种操作需要注意的属性是 inverse="true" cascade 和,插入子记录,要为子记录指定主档,然后保存。这么长代码没有看。建议你去找一个一对多能正确增删改查的例子。就知道你为什么配的不对。这个很难解释的,因为 Hibernate精通的不多,我也不精通,只是自己会用而已。
      

  4.   

    我希望你自己定义个Transaction ta=null;
    ta=session.beginTransaction();            
    ...
    ta.commit();
    ..
    ta.rallback();
      

  5.   

    你把异常吃掉啦,当然不能出现异常啦
    这里
    }catch(HibernateException e){
                System.out.println("hibernateException出错了");
                session.beginTransaction().rollback();
            }finally{
    改为
    }catch(HibernateException e){
    e.printStackTrace();
                System.out.println("hibernateException出错了");
                session.beginTransaction().rollback();
            }finally{