Greetings!
I'm wondering if anyone has any experience (or helpful tips) when attempting to use the Example implementation of Criterion to query a many-to-one by the "one" side.
Logically, I have a Record (table/class) and a Transaction (table/class) where Transaction has a FK to Record's PK. In java, my Transaction class has a field that is of type Record. I can insert/update/select just fine if I'm doing it by primary class, but if I'm trying to do it by association I run into problems. I'm attempting to build both a Transaction object and a Record object, then setting the Record's name field. I then set Transaction's record to be my new object, and make that my Example. When I try to retrieve the list, the show-sql shows only the values associated with the Transaction object.
I think I'm missing a property or attribute in the hibernate-mapping files that would allow me to do this, but I'm not sure. If anyone could take a look at my code/mappings and give some insight, that'd be great. Alternatively, if someone could tell me this just isn't possible, that'd be fine too as I could work on developing a different way to get the data I need.
Record.hbm.xml
Code:
<hibernate-mapping>
<class name="com.xxx.yyy.domain.RecordDTO"
table="RECORDS">
<id name="recordID"
column="RECORD_ID"
type="long">
<generator class="identity" />
</id>
<property
name="statusCd"
column="STATUS_CD"
type="string"/>
<property
name="policyNo"
column="PLCY_NO"
type="string"/>
<property
name="voidInd"
column="VOID_IND"
type="string"/>
</class>
</hibernate-mapping>
Transaction.hbm.xml
Code:
<hibernate-mapping>
<class name="com.xxx.yyy.domain.TransactionDTO"
table="TRANSACTIONS" lazy="false">
<id name="recordID"
column="TRANSACTION_ID"
type="long">
<generator class="identity" />
</id>
<property
name="pftId"
column="PFT_ID"
type="long"/>
<many-to-one
name="recordParent"
column="RECORD_ID"
class="com.xxx.yyy.domain.RecordDTO"
cascade="all"
lazy="false"
fetch="join"/>
<property
name="sentDt"
column="SENT_DT"
type="java.util.Date"/>
<property
name="approvalInd"
column="APPROVAL_IND"
type="string"/>
<property
name="sentInd"
column="SENT_IND"
type="string"/>
<property
name="voidInd"
column="VOID_IND"
type="string"/>
</class>
</hibernate-mapping>
Snippet of TransactionDTO.java
Code:
public class TransactionDTO implements Serializable {
private long recordID;
private recordDTO recordParent;
...
public long getRecordID() {
return recordID;
}
public void setRecordID(long recordID) {
this.recordID = recordID;
}
public RecordDTO getRecordParent() {
return recordParent;
}
public void setRecordParent(RecordDTO parent) {
this.recordParent = parent;
}
}
TransactionDaoHibernateImpl.java
Code:
public class TransactionDaoHibernateImpl extends HibernateDaoSupport{
public Collection fetchByExample() {
Collection myCol = new ArrayList();
TransactionDTO t = new TransactionDTO();
t.setVoided(false);
RecordDTO r = new RecordDTO();
r.setVoided(false);
r.setPolicyNo("zz");
t.setParentRecord(r);
Example ex = Example.create(t).excludeZeroes();
Session session = getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Criteria crit = session
.createCriteria(TransactionDTO.class)
.add(ex);
myCol = crit.list();
tx.rollback();
return myCol;
}
}
The resulting collection has Transactions that are not voided (with their associated Records), but does not limit based on the Record's policyNo being "zz"