I have the following problem:
The foreign key of a child class is not always filled with the same value as the primary key of the parent class.
I have two domain objects which also exist as MySQL tables namely Onderzoek and Monster. With a 0>n relationship
OND_Nummer is the primary key of Onderzoek
MON_Nummer_OND is the foreign key of Monster
Fetching of Monster rows is done with the join where OND_Nummer = MON_Nummer_OND
Fetching monster rows based on several onderzoek values results in inconsistent results. See for example a log4j comment:
Code:
18-aug-2009 11:51:04
INFO: 2009-08-18 11:51:04,668 DEBUG [nl.indrisoftware.cbwextranet.web.LablistsAction] - <nl.indrisoftware.cbwextranet.business.domain.OnderzoekWithMonsters Object {
OND_Nummer: 124325
}>
18-aug-2009 11:51:04
INFO: 2009-08-18 11:51:04,668 DEBUG [nl.indrisoftware.cbwextranet.web.LablistsAction] - <nl.indrisoftware.cbwextranet.business.domain.Monster Object {
MON_Nummer_OND: 124263
}>
As you can see OND_Nummer is not equal to MON_Nummer_OND
The hbm.xml is as follows:
Code:
<class name="OnderzoekWithMonsters" table="Onderzoek" mutable="false">
<id name="nummer" column="OND_Nummer" type="java.lang.Integer" >
<generator class="native" />
</id>
<property name="datum" column="OND_Datum" type="java.lang.Integer" />
<property name="status" column="OND_Status" type="java.lang.String" />
<property name="labOk" column="OND_LabOk" type="java.lang.Integer" />
<property name="toestand" column="OND_Toestand" type="java.lang.String" />
<property name="naam_REL" column="OND_Naam_REL" type="java.lang.String" />
<property name="nummer_REL" column="OND_Nummer_REL" type="java.lang.Integer" />
<set name="monsters" >
<key column="MON_Nummer_OND" not-null="true"/>
<one-to-many class="Monster" />
<filter name="normGroep" condition="MON_Normgroep NOT LIKE :exclude_910 AND MON_Normgroep NOT LIKE :exclude_Checklist"/>
</set>
</class>
<class name="Monster" table="Monster" mutable="false">
<id name="nummer" column="MON_Nummer" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="datum" column="MON_Datum" type="java.lang.Integer" />
<property name="onderzoekNummer" column="MON_Nummer_OND" type="java.lang.Integer" insert="false" update="false" not-null="true"/>
<property name="prodOms" column="MON_ProdOms" type="java.lang.String" />
<property name="omschrijving" column="MON_Omschrijving" type="java.lang.String" />
<property name="leverancier" column="MON_Leverancier" type="java.lang.String" />
<property name="temp" column="MON_Temp" type="java.lang.String" />
<property name="beoordeling" column="MON_Beoordeling" type="java.lang.String" />
<property name="normgroep" column="MON_Normgroep" type="java.lang.String" />
</class>
With the java code as follows:
Code:
public Collection<OnderzoekWithMonsters> getOnderzoekenByRels(Collection<Integer> relatieNummers, int dateFrom,
int dateUntil) throws DataAccessException {
// do not select monsters where MON_Normgroep contains 910 or Checklist
String exclude_910 = "910%";
String exclude_Checklist = "Checklist";
Session session = sessionFactory.getCurrentSession();
session.enableFilter("normGroep").setParameter("exclude_910", exclude_910).setParameter("exclude_Checklist",
exclude_Checklist);
Query q = session
.createQuery("from OnderzoekWithMonsters onderzoek where onderzoek.nummer_REL IN (:rels) and onderzoek.datum >= :dateFrom and onderzoek.datum <= :dateUntil order by onderzoek.datum desc");
q.setParameterList("rels", relatieNummers).setInteger("dateFrom", dateFrom).setInteger("dateUntil", dateUntil);
List<OnderzoekWithMonsters> onderzoeken = q.list();
return onderzoeken;
}
Resulting in the following SQL hibernate statements:
Code:
18-aug-2009 11:51:03
INFO: Hibernate: select onderzoekw0_.OND_Nummer as OND1_18_, onderzoekw0_.OND_Datum as OND2_18_, onderzoekw0_.OND_Status as OND3_18_, onderzoekw0_.OND_LabOk as OND4_18_, onderzoekw0_.OND_Toestand as OND5_18_, onderzoekw0_.OND_Naam_REL as OND6_18_, onderzoekw0_.OND_Nummer_REL as OND7_18_ from Onderzoek onderzoekw0_ where (onderzoekw0_.OND_Nummer_REL in (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?)) and onderzoekw0_.OND_Datum>=? and onderzoekw0_.OND_Datum<=? order by onderzoekw0_.OND_Datum desc
18-aug-2009 11:51:03
INFO: Hibernate: select monsters0_.MON_Nummer_OND as MON3_1_, monsters0_.MON_Nummer as MON1_1_, monsters0_.MON_Nummer as MON1_19_0_, monsters0_.MON_Datum as MON2_19_0_, monsters0_.MON_Nummer_OND as MON3_19_0_, monsters0_.MON_ProdOms as MON4_19_0_, monsters0_.MON_Omschrijving as MON5_19_0_, monsters0_.MON_Leverancier as MON6_19_0_, monsters0_.MON_Temp as MON7_19_0_, monsters0_.MON_Beoordeling as MON8_19_0_, monsters0_.MON_Normgroep as MON9_19_0_ from Monster monsters0_ where monsters0_.MON_Normgroep NOT LIKE ? AND monsters0_.MON_Normgroep NOT LIKE ? and monsters0_.MON_Nummer_OND=?
…….
As I minimize the number of results by decreasing the date period the results are more consistent.
I already tried, among other options, for example:
Code:
<class name="OnderzoekWithMonsters" table="Onderzoek" mutable="false">
<id name="nummer" column="OND_Nummer" type="java.lang.Integer" >
<generator class="native" />
</id>
<property name="datum" column="OND_Datum" type="java.lang.Integer" />
<property name="status" column="OND_Status" type="java.lang.String" />
<property name="labOk" column="OND_LabOk" type="java.lang.Integer" />
<property name="toestand" column="OND_Toestand" type="java.lang.String" />
<property name="naam_REL" column="OND_Naam_REL" type="java.lang.String" />
<property name="nummer_REL" column="OND_Nummer_REL" type="java.lang.Integer" />
<set name="monsters" inverse="true" cascade="all-delete-orphan">
<key column="MON_Nummer_OND" />
<one-to-many class="Monster" />
<filter name="normGroep" condition="MON_Normgroep NOT LIKE :exclude_910 AND MON_Normgroep NOT LIKE :exclude_Checklist"/>
</set>
</class>
<class name="Monster" table="Monster" mutable="false">
<id name="nummer" column="MON_Nummer" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="datum" column="MON_Datum" type="java.lang.Integer" />
<property name="onderzoekNummer" column="MON_Nummer_OND" type="java.lang.Integer" insert="false" update="false" not-null="true"/>
<property name="prodOms" column="MON_ProdOms" type="java.lang.String" />
<property name="omschrijving" column="MON_Omschrijving" type="java.lang.String" />
<property name="leverancier" column="MON_Leverancier" type="java.lang.String" />
<property name="temp" column="MON_Temp" type="java.lang.String" />
<property name="beoordeling" column="MON_Beoordeling" type="java.lang.String" />
<property name="normgroep" column="MON_Normgroep" type="java.lang.String" />
<many-to-one name="onderzoek" column="MON_Nummer_OND" not-null="true"/>
</class>
With the same inconsistent results.
How can I fix this problem?