We have a problem with a criteria query, if fields UOI and UOM that references the same table (one to one mapping) have the same value
the exception in subject will be thrown, in the other case no. The exception was caused by a second query executed on the referenced table, this is the sequence:
INFO [STDOUT] Hibernate:
select
this_.ID_PNR as ID1_342_4_,
this_.LMD as LMD342_4_,
this_.LMF as LMF342_4_,
this_.LMU as LMU342_4_,
this_.MFC as MFC342_4_,
this_.UOI as UOI342_4_,
this_.UOM as UOM342_4_,
this_.CMK as CMK342_4_,
this_.DFP as DFP342_4_,
this_.FTC as FTC342_4_,
this_.HAZ as HAZ342_4_,
this_.ITY as ITY342_4_,
this_.KWD as KWD342_4_,
this_.NSN as NSN342_4_,
this_.PHO as PHO342_4_,
this_.PLC as PLC342_4_,
this_.PNR as PNR342_4_,
this_.PNR_COMP as PNR18_342_4_,
this_.PSC as PSC342_4_,
this_.SPU as SPU342_4_,
this_.SUU as SUU342_4_,
this_.WPU as WPU342_4_,
this_.WUU as WUU342_4_,
this_.TCM as TCM342_4_,
this_.ESD as ESD342_4_,
this_.PUI as PUI342_4_,
this_.QUI as QUI342_4_,
this_.RFS as RFS342_4_,
this_.SRA as SRA342_4_,
this_.STR as STR342_4_,
this_.TBF as TBF342_4_,
this_.TLF as TLF342_4_,
valmfc1_.MFC as MFC338_0_,
valmfc1_.LMU as LMU338_0_,
valmfc1_.LMF as LMF338_0_,
valmfc1_.LMD as LMD338_0_,
valmfc1_.RAG as RAG338_0_,
valmfc1_.ADDR as ADDR338_0_,
valmfc1_.PHONE as PHONE338_0_,
valmfc1_.FAX as FAX338_0_,
valmfc1_.CUR as CUR338_0_,
valmfc1_.EMAIL as EMAIL338_0_,
valmfc1_.WEB as WEB338_0_,
valmfc1_.TYP as TYP338_0_,
valmfc1_.STATE as STATE338_0_,
valmfc1_.CITY as CITY338_0_,
valmfc1_.ZIP_CODE as ZIP15_338_0_,
loglibcurr6_.CUR as CUR340_1_,
loglibcurr6_.DESCRIPTION as DESCRIPT2_340_1_,
loglibcurr6_.K_FACT as K3_340_1_,
loglibcurr6_.LMD as LMD340_1_,
loglibcurr6_.LMF as LMF340_1_,
loglibcurr6_.LMU as LMU340_1_,
valuom2_.ID_UOM_LNG as ID1_341_2_,
valuom2_.UOM as UOM341_2_,
valuom2_.LNG as LNG341_2_,
valuom2_.DESCRIPTION as DESCRIPT4_341_2_,
valuom2_.TYP as TYP341_2_,
valuom2_.LMU as LMU341_2_,
valuom2_.LMF as LMF341_2_,
valuom2_.LMD as LMD341_2_,
valuoi3_.ID_UOM_LNG as ID1_341_3_,
valuoi3_.UOM as UOM341_3_,
valuoi3_.LNG as LNG341_3_,
valuoi3_.DESCRIPTION as DESCRIPT4_341_3_,
valuoi3_.TYP as TYP341_3_,
valuoi3_.LMU as LMU341_3_,
valuoi3_.LMF as LMF341_3_,
valuoi3_.LMD as LMD341_3_
from
LOG_ANG_PNR this_
inner join
LOG_LIB_MFC valmfc1_
on this_.MFC=valmfc1_.MFC
left outer join
LOG_LIB_CURRENCIES loglibcurr6_
on valmfc1_.CUR=loglibcurr6_.CUR
inner join
LOG_LIB_UOM valuom2_
on this_.UOM=valuom2_.UOM
inner join
LOG_LIB_UOM valuoi3_
on this_.UOI=valuoi3_.UOM
where
(
1=1
)
and (
1=1
)
and (
lower(valuom2_.LNG)=?
)
and (
lower(valuoi3_.LNG)=?
)
order by
this_.ID_PNR asc
17:21:44,781 INFO [STDOUT] Hibernate:
select
loglibuom0_.ID_UOM_LNG as ID1_341_0_,
loglibuom0_.UOM as UOM341_0_,
loglibuom0_.LNG as LNG341_0_,
loglibuom0_.DESCRIPTION as DESCRIPT4_341_0_,
loglibuom0_.TYP as TYP341_0_,
loglibuom0_.LMU as LMU341_0_,
loglibuom0_.LMF as LMF341_0_,
loglibuom0_.LMD as LMD341_0_
from
LOG_LIB_UOM loglibuom0_
where
loglibuom0_.UOM=?
17:21:44,812 ERROR [STDERR] org.hibernate.HibernateException: More than one row with the given identifier was found: elsagdatamat.edis.hibernate.mapping.logistic.LogLibUom@fbccad, for class: elsagdatamat.edis.hibernate.mapping.logistic.LogLibUom
if the value of fields UOI and UOM are different the exception will not be thrown and the second query on the referenced table will not be executed.
Hibernate version: 3.2.4 sp1
Mapping documents:
@Entity
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
@Table(name = "LOG_ANG_PNR")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class LogAngPnr implements Serializable {
//Colonne standard per Version, User e Function
@Column(name = "LMD")
@Version
private Timestamp lmd;
@Column(name = "LMF")
private String lmf;
@Column(name = "LMU")
private String lmu;
//Primary Key
@Column(name = "ID_PNR")
@Id
private BigDecimal idPnr;
//Foreign Key
@Column(name = "MFC")
private String mfc;
@Column(name = "UOI")
private String uoi;
@Column(name = "UOM")
private String uom;
//Campi
@Column(name = "CMK")
private String cmk;
@Column(name = "DFP")
private String dfp;
@Column(name = "FTC")
private String ftc;
@Column(name = "HAZ")
private String haz;
@Column(name = "ITY")
private String ity;
@Column(name = "KWD")
private String kwd;
@Column(name = "NSN")
private String nsn;
@Column(name = "PHO")
private String pho;
@Column(name = "PLC")
private String plc;
@Column(name = "PNR")
private String pnr;
@Column(name = "PNR_COMP")
private String pnrComp;
@Column(name = "PSC")
private String psc;
@Column(name = "SPU")
private String spu;
@Column(name = "SUU")
private String suu;
@Column(name = "WPU")
private String wpu;
@Column(name = "WUU")
private String wuu;
@Column(name = "TCM")
private String tcm;
@Column(name = "ESD")
private BigDecimal esd;
@Column(name = "PUI")
private BigDecimal pui;
@Column(name = "QUI")
private BigDecimal qui;
@Column(name = "RFS")
private BigDecimal rfs;
@Column(name = "SRA")
private BigDecimal sra;
@Column(name = "STR")
private BigDecimal str;
@Column(name = "TBF")
private BigDecimal tbf;
@Column(name = "TLF")
private BigDecimal tlf;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "MFC", insertable = false, updatable = false)
private LogLibMfc logLibMfc;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "UOM", referencedColumnName = "UOM", insertable = false, updatable = false, unique = false)
private LogLibUom logUom;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "UOI", referencedColumnName = "UOM", insertable = false, updatable = false, unique = false)
private LogLibUom logUoi;
....
}
@Entity
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
@Table(name = "LOG_LIB_UOM")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class LogLibUom implements Serializable {
@Column(name = "ID_UOM_LNG") @Id
private BigDecimal idUomLng;
@Column(name = "UOM")
private String uom;
@Column(name = "LNG")
private String lng;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "TYP")
private String typ;
@Column(name = "LMU")
private String lmu;
@Column(name = "LMF")
private String lmf;
@Column(name = "LMD") @Version
private Timestamp lmd;
...
}
Code between sessionFactory.openSession() and session.close():
Example logAngPnrEx = Example.create(filterObject).ignoreCase().enableLike(MatchMode.START);
Example logLibMfcEx = Example.create(filterObject.getLogLibMfc()).ignoreCase().enableLike(MatchMode.START);
Example logLibUomEx = Example.create(filterObject.getLogUom()).ignoreCase();
Example logLibUoiEx = Example.create(filterObject.getLogUoi()).ignoreCase();
Criteria criteria = hs.createCriteria(LogAngPnr.class).
add(logAngPnrEx).
addOrder(Order.asc("idPnr")).
createCriteria("this.logLibMfc", "valMfc", CriteriaSpecification.INNER_JOIN).
add(logLibMfcEx).
setFetchMode("valMfc", FetchMode.JOIN).
createCriteria("this.logUom", "valUom", CriteriaSpecification.INNER_JOIN).
add(logLibUomEx).
setFetchMode("valUom", FetchMode.JOIN).
createCriteria("this.logUoi", "valUoi", CriteriaSpecification.INNER_JOIN).
add(logLibUoiEx).
setFetchMode("valUoi", FetchMode.JOIN);
return new ArrayList(criteria.list());
....
Thanks.
|