初学ssh,用这个来做毕设,测试时遇到这么个问题,第一个学生能顺利插入,第二个就抱错,以下是我写的相关程序PO:individual.java(学生)package com.gp.po;import java.util.Date;
import java.util.HashSet;
import java.util.Set;/**
* Individual generated by MyEclipse Persistence Tools
*/public class Individual implements java.io.Serializable
{    
  private static final long serialVersionUID = 48L;
  private Integer individualId;
  private String certType;
  .............................//其他基本属性  private School school;//就读学校
...................//其他类属性  // Constructors  /** default constructor */
  public Individual()
  {
  }
  
  ......................//getter、setter、equals()等
}
***********************************************************
PO:School.java-----就读学校package com.gp.po;import java.util.HashSet;
import java.util.Set;/**
* School generated by MyEclipse Persistence Tools
*/public class School implements java.io.Serializable
{
  private static final long serialVersionUID = 48L;
  private Integer schoolId;
  private String schoolName;
  private String contactEmail;
  ..................//其他基本属性
    
  private Set<Individual> individuals = new HashSet<Individual>();//该学校对应的学生
  ....................//其他类属性  // Constructors  /** default constructor */
  public School()
  {
  }
  
  ......................//getter、setter、equals()等
}
各自对应的hbm.xml配置
individual中的
<many-to-one name="school" class="com.gp.po.School"
            column="school_id" lazy="false">
        </many-to-one>school中的
<set name="individuals" cascade="all-delete-orphan"
            inverse="true" lazy="true">
            <key column="individual_id"></key>
            <one-to-many class="com.gp.po.Individual" />
        </set>然后下面是test.java,测试用的package com.gp.test;import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;import com.gp.po.Address;
import com.gp.po.CooperOrg;
import com.gp.po.Guarantor;
import com.gp.po.Individual;
import com.gp.po.School;
import com.gp.service.TestService;public class Test
{    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        ApplicationContext ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/applicationContext.xml");
        TestService ts = (TestService)ctx.getBean("testService");   ---TestService通过调用dao接口实现数据的持久化
        School school = new School();
        school.setSchoolName("朝16236");
        ts.saveOrUpdate(school);   ------------------存储学校
        System.out.println(school.getSchoolId());
        
        Guarantor g = new Guarantor();
        g.setGuarantorName("担保123");   -------------与school类似的共同借款人
        ts.saveOrUpdate(g);
        
        CooperOrg org = new CooperOrg();
        org.setCooperOrgName("测试资11一");   ----------与school类似的资助中心        
          ts.saveOrUpdate(org);
        
        Individual mm = new Individual();
        mm.setIndividualName("人5660");
        mm.setOrg(org);
        mm.setSchool(school);
        mm.setGuarantor(g);
        ts.saveOrUpdate(mm);   ----这个顺利存入
        
        Individual nn = new Individual();
        nn.setIndividualName("人PPP");
        nn.setOrg(org);
        nn.setSchool(school);
        nn.setGuarantor(g);
        System.out.println(school.getSchoolId() + "第二");
        ts.saveOrUpdate(nn);      -------这里这个就存不进去了
                
    }}(控制台信息贴在下面,长度不够)据我同事分析,是因为我po中使用了类的属性,在存储第二个individual时由于关联到与第一个相同的
School,会把这个School再存储一遍,就违反了数据库的约束。但是我看网上一对多的关系都是我这样的配置,他们也没什么问题,请大家解答下
唉,普通区没人理,已经困了好些天了,到处查资料也没找到个原因,大家帮帮忙啊

解决方案 »

  1.   

    以下是控制台信息
    log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate: insert into gp__school (school_name, property, primary_category, secondary_category, pertained_province, contact_person, contact_tel, contact_mobile_phone, contact_email, address_id, acct_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    1
    Hibernate: insert into gp__guarantor (health_status, relation, cert_type, cert_id, guarantor_name, province, city, county, address_id, working_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    Hibernate: insert into gp__cooper_org (cooper_org_name, pertained_bank, cooper_org_level, address_id) values (?, ?, ?, ?)
    Hibernate: insert into gp__individual (cert_type, cert_id, individual_name, gender, birthday, graduate_school, g_postal_code, dorm_tel, pre_province, pre_city, pre_county, province, city, county, individual_status_code, pre_individual_status_code, guarantor_id, working_id, cooper_org_id, address_id, school_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    Hibernate: update gp__guarantor set health_status=?, relation=?, cert_type=?, cert_id=?, guarantor_name=?, province=?, city=?, county=?, address_id=?, working_id=? where guarantor_id=?
    1第二
    Hibernate: insert into gp__individual (cert_type, cert_id, individual_name, gender, birthday, graduate_school, g_postal_code, dorm_tel, pre_province, pre_city, pre_county, province, city, county, individual_status_code, pre_individual_status_code, guarantor_id, working_id, cooper_org_id, address_id, school_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not insert: [com.gp.po.Individual]; SQL [insert into gp__individual (cert_type, cert_id, individual_name, gender, birthday, graduate_school, g_postal_code, dorm_tel, pre_province, pre_city, pre_county, province, city, county, individual_status_code, pre_individual_status_code, guarantor_id, working_id, cooper_org_id, address_id, school_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; Cannot add or update a child row: a foreign key constraint fails (`gp/gp__individual`, CONSTRAINT `FKFD3DA2993F06036C` FOREIGN KEY (`individual_id`) REFERENCES `gp__school` (`school_id`)); nested exception is com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`gp/gp__individual`, CONSTRAINT `FKFD3DA2993F06036C` FOREIGN KEY (`individual_id`) REFERENCES `gp__school` (`school_id`))
    com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`gp/gp__individual`, CONSTRAINT `FKFD3DA2993F06036C` FOREIGN KEY (`individual_id`) REFERENCES `gp__school` (`school_id`))
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
        at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1169)
        at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:693)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1404)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1318)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1303)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
        at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1759)
        at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2178)
        at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:240)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:95)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)
        at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:463)
        at org.springframework.orm.hibernate3.HibernateTemplate$18.doInHibernate(HibernateTemplate.java:693)
        at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
        at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:690)
        at com.gp.dao.IndividualDAO.saveOrUpdate(IndividualDAO.java:115)
        at com.gp.service.TestService.saveOrUpdate(TestService.java:107)
        at com.gp.test.Test.main(Test.java:54)