Hi,
I'm having problems with a fairly simple bi-directional relationship (one-to-many). These objects are not in a Parent/Child relationship, but when I do a query on the top level object, hibernate deletes all the objects from the db for both the top level and the lower-level object. Below is all the relevant information. Note that a Product can have multiple PaymentDetail, but when I encounter the problem there are no relationships between the items in the existing data. You can see below, after the session.close(), there is a series of deletes performed bby Hibernate.
Any help is highly appreciated!
Regards
Chris.
Hibernate version: 3
Mapping documents:
<hibernate-mapping>
<class name="au.com.qantas.ecomm.payment.model.product.Product" table="TCEO_DELAYED_PAYMENT_PRODUCT" mutable="true" lazy="false">
<!-- Primary key -->
<id name="id" type="integer" unsaved-value="null" column="PRODUCT_ID">
<generator class="increment"/>
</id>
<set name="payments" lazy="false" cascade="none" inverse="true">
<key column="PRODUCT_ID"/>
<one-to-many class="au.com.qantas.ecomm.payment.model.payments.Payment"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="au.com.qantas.ecomm.payment.model.payments.Payment" table="TCEO_PAYMENT_DETAIL" mutable="true" lazy="false">
<!-- Primary key -->
<!--<id name="id" type="integer" unsaved-value="null">-->
<id name="id" column="PAYMENT_DETAIL_ID">
<generator class="increment"/>
</id>
<many-to-one name="product" class="au.com.qantas.ecomm.payment.model.product.Product" column="PRODUCT_ID" cascade="none"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
Session session = HibernateUtil.getSession();
List products = null;
try {
System.out.println("before Criteria");
Criteria criteria = session.createCriteria(Product.class);
System.out.println("before criteria.add");
criteria.add(Restrictions.eq("status", status));
System.out.println("before products");
products = criteria.list();
System.out.println("before Hibernate.initialize");
Hibernate.initialize(products);
if (products == null)
products = new ArrayList();
} catch (HibernateException hibernateException) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Hibernation error getting product in ProductDAO", hibernateException);
}
throw new DAOException(hibernateException);
} catch (Exception exception) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Exception caught: ", exception);
}
} finally {
try {
System.out.println("before session.close()");
session.close();
System.out.println("after session.close()");
Name and version of the database you are using: Oracle 8i
The generated SQL (show_sql=true):
before Criteria
before criteria.add
before products
Hibernate: select this_.PRODUCT_ID as PRODUCT1_0_, this_.PRODUCT_CONTACT_NAME as PRODUCT3_0_0_, this_.CUST_REF_NUMBER as CUST4_0_0_, this_.TOTAL_FARE_
AUD_AMT as TOTAL5_0_0_, this_.PRODUCT_CONTACT_EMAIL_TEXT as PRODUCT6_0_0_, this_.PRODUCT_CREATION_DATE as PRODUCT7_0_0_, this_.PRODUCT_PAYMENT_EXPIRY_DATE as PRODUCT8_0_0_, this_.PRODUCT_CURR_PAYM_STATUS_CODE as PRODUCT9_0_0_, this_.PRODUCT_CODE as PRODUCT10_0_0_, this_.PRODUCT_TYPE_CODE as PRODUCT2_0_ from TCEO_DELAYED_PAYMENT_PRODUCT this_ where this_.PRODUCT_CURR_PAYM_STATUS_CODE=?
Hibernate: select payments0_.PRODUCT_ID as PRODUCT8_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_0_, payments0_.PAYMENT_AMT as PAYMENT3_5_0_, payments0_.CUST_REF_NUMBER as CUST4_5_0_, payments0_.PAYMENT_TSP as PAYMENT5_5_0_, payments0_.PAYMENT_DR_CR_TYPE_CODE as PAYMENT6_5_0_, payments0_.PAYMENT_CURRENT_STATUS_CODE as PAYMENT7_5_0_, payments0_.PRODUCT_ID as PRODUCT8_5_0_, payments0_.PAYMENT_ACCOUNT_ID as PAYMENT9_5_0_, payments0_.PAYMENT_TXN_REF_NUMBER as PAYMENT10_5_0_, payments0_.PAYMENT_INSTRUCTION_CODE as PAYMENT11_5_0_, payments0_.PAYMENT_METHOD_CODE as PAYMENT12_5_0_, payments0_.PAYMENT_REASON_DESC as PAYMENT13_5_0_, payments0_.PAYMENT_ORGNL_TXN_REF_NUMBER as PAYMENT14_5_0_, payments0_.DELAYED_PAYMENT_TYPE_CODE as DELAYED2_0_ from TCEO_PAYMENT_DETAIL payments0_ where payments0_.PRODUCT_ID=?
Hibernate: select payments0_.PRODUCT_ID as PRODUCT8_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_0_, payments0_.PAYMENT_AMT as PAYMENT3_5_0_, payments0_.CUST_REF_NUMBER as CUST4_5_0_, payments0_.PAYMENT_TSP as PAYMENT5_5_0_, payments0_.PAYMENT_DR_CR_TYPE_CODE as PAYMENT6_5_0_, payments0_.PAYMENT_CURRENT_STATUS_CODE as PAYMENT7_5_0_, payments0_.PRODUCT_ID as PRODUCT8_5_0_, payments0_.PAYMENT_ACCOUNT_ID as PAYMENT9_5_0_, payments0_.PAYMENT_TXN_REF_NUMBER as PAYMENT10_5_0_, payments0_.PAYMENT_INSTRUCTION_CODE as PAYMENT11_5_0_, payments0_.PAYMENT_METHOD_CODE as PAYMENT12_5_0_, payments0_.PAYMENT_REASON_DESC as PAYMENT13_5_0_, payments0_.PAYMENT_ORGNL_TXN_REF_NUMBER as PAYMENT14_5_0_, payments0_.DELAYED_PAYMENT_TYPE_CODE as DELAYED2_0_ from TCEO_PAYMENT_DETAIL payments0_ where payments0_.PRODUCT_ID=?
Hibernate: select payments0_.PRODUCT_ID as PRODUCT8_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_0_, payments0_.PAYMENT_AMT as PAYMENT3_5_0_, payments0_.CUST_REF_NUMBER as CUST4_5_0_, payments0_.PAYMENT_TSP as PAYMENT5_5_0_, payments0_.PAYMENT_DR_CR_TYPE_CODE as PAYMENT6_5_0_, payments0_.PAYMENT_CURRENT_STATUS_CODE as PAYMENT7_5_0_, payments0_.PRODUCT_ID as PRODUCT8_5_0_, payments0_.PAYMENT_ACCOUNT_ID as PAYMENT9_5_0_, payments0_.PAYMENT_TXN_REF_NUMBER as PAYMENT10_5_0_, payments0_.PAYMENT_INSTRUCTION_CODE as PAYMENT11_5_0_, payments0_.PAYMENT_METHOD_CODE as PAYMENT12_5_0_, payments0_.PAYMENT_REASON_DESC as PAYMENT13_5_0_, payments0_.PAYMENT_ORGNL_TXN_REF_NUMBER as PAYMENT14_5_0_, payments0_.DELAYED_PAYMENT_TYPE_CODE as DELAYED2_0_ from TCEO_PAYMENT_DETAIL payments0_ where payments0_.PRODUCT_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: select payments0_.PRODUCT_ID as PRODUCT8_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_1_, payments0_.PAYMENT_DETAIL_ID as PAYMENT1_0_, payments0_.PAYMENT_AMT as PAYMENT3_5_0_, payments0_.CUST_REF_NUMBER as CUST4_5_0_, payments0_.PAYMENT_TSP as PAYMENT5_5_0_, payments0_.PAYMENT_DR_CR_TYPE_CODE as PAYMENT6_5_0_, payments0_.PAYMENT_CURRENT_STATUS_CODE as PAYMENT7_5_0_, payments0_.PRODUCT_ID as PRODUCT8_5_0_, payments0_.PAYMENT_ACCOUNT_ID as PAYMENT9_5_0_, payments0_.PAYMENT_TXN_REF_NUMBER as PAYMENT10_5_0_, payments0_.PAYMENT_INSTRUCTION_CODE as PAYMENT11_5_0_, payments0_.PAYMENT_METHOD_CODE as PAYMENT12_5_0_, payments0_.PAYMENT_REASON_DESC as PAYMENT13_5_0_, payments0_.PAYMENT_ORGNL_TXN_REF_NUMBER as PAYMENT14_5_0_, payments0_.DELAYED_PAYMENT_TYPE_CODE as DELAYED2_0_ from TCEO_PAYMENT_DETAIL payments0_ where payments0_.PRODUCT_ID=?
before Hibernate.initialize
before session.close()
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: delete from TCEO_PAYMENT_DETAIL where PAYMENT_DETAIL_ID=?
Hibernate: select history0_.PRODUCT_ID as PRODUCT2_1_, history0_.PRODUCT_STATUS_HIST_ID as PRODUCT1_1_, history0_.PRODUCT_STATUS_HIST_ID as PRODUCT1_0_, history0_.PRODUCT_ID as PRODUCT2_1_0_, history0_.PROCESS_TSP as PROCESS3_1_0_, history0_.PROCESS_TYPE_CODE as PROCESS4_1_0_, history0_.PRODUCT_STATUS_CODE as PRODUCT5_1_0_, history0_.PRODUCT_STATUS_TEXT as PRODUCT6_1_0_ from TCEO_PRODUCT_STATUS_HIST history0_ where history0_.PRODUCT_ID=?
Hibernate: delete from TCEO_PRODUCT_STATUS_HIST where PRODUCT_STATUS_HIST_ID=?
Hibernate: delete from TCEO_DELAYED_PAYMENT_PRODUCT where PRODUCT_ID=?
Hibernate: select history0_.PRODUCT_ID as PRODUCT2_1_, history0_.PRODUCT_STATUS_HIST_ID as PRODUCT1_1_, history0_.PRODUCT_STATUS_HIST_ID as PRODUCT1_0_, history0_.PRODUCT_ID as PRODUCT2_1_0_, history0_.PROCESS_TSP as PROCESS3_1_0_, history0_.PROCESS_TYPE_CODE as PROCESS4_1_0_, history0_.PRODUCT_STATUS_CODE as PRODUCT5_1_0_, history0_.PRODUCT_STATUS_TEXT as PRODUCT6_1_0_ from TCEO_PRODUCT_STATUS_HIST history0_ where history0_.PRODUCT_ID=?
Hibernate: delete from TCEO_PRODUCT_STATUS_HIST where PRODUCT_STATUS_HIST_ID=?
Hibernate: delete from TCEO_DELAYED_PAYMENT_PRODUCT where PRODUCT_ID=?
Hibernate: delete from TCEO_DELAYED_PAYMENT_PRODUCT where PRODUCT_ID=?
Hibernate: delete from TCEO_DELAYED_PAYMENT_PRODUCT where PRODUCT_ID=?
|