Spring + Hibernate:具有相同标识符值的另一个对象已与会话关联

在使用Spring和Hibernate的应用程序中,我解析CSV文件,并在handleRow()每次从CSV文件中读取记录时通过调用来填充db 。

我的域模型:

`’Family’ has many ‘SubFamily’

‘SubFamily’ has many ‘Locus’

a ‘Locus’ belongs to a ‘Species’`

Family <-> SubFamily <-> Locus都是双向映射。

码:

public void handleRow(Family dummyFamily, SubFamily dummySubFamily, Locus dummyLocus) {

//Service method which access DAO layers

CommonService serv = ctx.getCommonService();

boolean newFamily=false;

Family family=serv.getFamilyByFamilyId(dummyFamily.getFamilyId());

if(family==null){

newFamily=true;

family=new Family();

family.setFamilyId(dummyFamily.getFamilyId());

family.setFamilyIPRId(dummyFamily.getFamilyIPRId());

family.setFamilyName(dummyFamily.getFamilyName());

family.setFamilyPattern(dummyFamily.getFamilyPattern());

family.setRifID(dummyFamily.getRifID());

}

SubFamily subFamily = family.getSubFamilyBySubFamilyId( dummySubFamily.getSubFamilyId() );

if(subFamily==null){

subFamily=new SubFamily();

subFamily.setRifID(dummySubFamily.getRifID());

subFamily.setSubFamilyId(dummySubFamily.getSubFamilyId());

subFamily.setSubFamilyIPRId(dummySubFamily.getSubFamilyIPRId());

subFamily.setSubFamilyName(dummySubFamily.getSubFamilyName());

subFamily.setSubFamilyPattern(dummySubFamily.getSubFamilyPattern());

family.addSubFamily(subFamily);

}

//use the save reference, to update from GFF handler

Locus locus = dummyLocus;

subFamily.addLocus(locus);

assignSpecies(serv,locus);

//Persist object

if(newFamily){

serv.createFamily(family);

} else {

serv.updateFamily(family);

}

}

使用以下方法将物种分配给场所,该方法仅访问DAO层:

private void assignSpecies (CommonService serv, Locus locus) {

String locusId = locus.getLocusId();

String speciesId = CommonUtils.getLocusSpecies(locusId, ctx.getSpeciesList()).getSpeciesId();

//Simply get Species object from DAO

Species sp = serv.getSpeciesBySpeciesId(speciesId);

locus.setSpecies(sp);

}

Hibernate给出以下错误:

[INFO] Starting scheduled refresh cache with period [5000ms]

Hibernate: insert into species (species_id, name) values (?, ?)

Hibernate: insert into species (species_id, name) values (?, ?)

Hibernate: insert into species (species_id, name) values (?, ?)

############################ROW#####################1

SubFamiyID#######RIF0005913

Hibernate: select this_.id as id1_0_, this_.family_id as family2_1_0_, this_.rif_iD as rif3_1_0_, this_.family_name as family4_1_0_, this_.family_ipr_id as family5_1_0_, this_.family_pattern as family6_1_0_ from family this_ where this_.family_id=?

Creating NEW SubFamiyID#######RIF0005913

Hibernate: select this_.id as id3_0_, this_.species_id as species2_3_0_, this_.name as name3_0_ from species this_ where this_.species_id=?

Hibernate: insert into family (family_id, rif_iD, family_name, family_ipr_id, family_pattern) values (?, ?, ?, ?, ?)

Hibernate: insert into subfamily (sub_family_id, rif_iD, sub_family_name, sub_family_ipr_id, sub_family_pattern, family_id, sub_family_index) values (?, ?, ?, ?, ?, ?, ?)

Hibernate: insert into locus (locus_id, refTrans_id, function, species_id, sub_family_id, sub_family_index) values (?, ?, ?, ?, ?, ?)

Hibernate: update species set species_id=?, name=? where id=?

Hibernate: update subfamily set family_id=?, sub_family_index=? where id=?

Hibernate: update locus set sub_family_id=?, sub_family_index=? where id=?

############################ROW#####################2

SubFamiyID#######RIF0005913

Hibernate: select this_.id as id1_0_, this_.family_id as family2_1_0_, this_.rif_iD as rif3_1_0_, this_.family_name as family4_1_0_, this_.family_ipr_id as family5_1_0_, this_.family_pattern as family6_1_0_ from family this_ where this_.family_id=?

Hibernate: select subfamilie0_.family_id as family7_1_, subfamilie0_.id as id1_, subfamilie0_.sub_family_index as sub8_1_, subfamilie0_.id as id0_0_, subfamilie0_.sub_family_id as sub2_0_0_, subfamilie0_.rif_iD as rif3_0_0_, subfamilie0_.sub_family_name as sub4_0_0_, subfamilie0_.sub_family_ipr_id as sub5_0_0_, subfamilie0_.sub_family_pattern as sub6_0_0_, subfamilie0_.family_id as family7_0_0_ from subfamily subfamilie0_ where subfamilie0_.family_id=?

Hibernate: select locuslist0_.sub_family_id as sub5_1_, locuslist0_.id as id1_, locuslist0_.sub_family_index as sub7_1_, locuslist0_.id as id2_0_, locuslist0_.locus_id as locus2_2_0_, locuslist0_.refTrans_id as refTrans3_2_0_, locuslist0_.function as function2_0_, locuslist0_.sub_family_id as sub5_2_0_, locuslist0_.species_id as species6_2_0_ from locus locuslist0_ where locuslist0_.sub_family_id=?

Hibernate: select species0_.id as id3_0_, species0_.species_id as species2_3_0_, species0_.name as name3_0_ from species species0_ where species0_.id=?

Hibernate: select this_.id as id1_0_, this_.family_id as family2_1_0_, this_.rif_iD as rif3_1_0_, this_.family_name as family4_1_0_, this_.family_ipr_id as family5_1_0_, this_.family_pattern as family6_1_0_ from family this_ where this_.family_id=?

Hibernate: select this_.id as id3_0_, this_.species_id as species2_3_0_, this_.name as name3_0_ from species this_ where this_.species_id=?

Exception in thread "main" [INFO] Closing Compass [compass]

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.bigg.nihonbare.common.domain.Species#1]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.bigg.nihonbare.common.domain.Species#1]

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.bigg.nihonbare.common.domain.Species#1]

at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:590)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:284)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)

at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)

at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)

回答:

使用merge()。该异常表示当前会话已经知道你要传递的实体。如果不是,请检查你的覆盖方式,hashCode()并且equals()-应该为不同的实体返回不同的值。

以上是 Spring + Hibernate:具有相同标识符值的另一个对象已与会话关联 的全部内容, 来源链接: utcz.com/qa/413306.html

回到顶部