編程經(jīng)驗(hibernate 1)
1>
錯誤顯示:
net.sf.hibernate.PropertyValueException: not-null property references a null or transient value: com.Order.customer
部分原文件:( customer 和 order 類關(guān)系:一對多關(guān)聯(lián))
Order.hbm.xml
……………
<
many-to-one
???????
name
=
"customer"
???????
column
=
"CUSTOMER_ID"
???????
class
=
"com.Customer"
???????
not-null
=
"true"
???????
cascade
=
"save-update"
?????
????
/>
執(zhí)行文件:
………
Session session = sessionFactory.openSession();
??? Transaction tx = null;
??? try {
????? // Create some data and persist it
???? tx = session.beginTransaction();
???? Customer customer=new Customer();
???? customer.setName("Jack");
????
???? Order order=new Order();
???? order.setOrderNumber("Jack_Order001");
???????? session.save(customer);
???????? session.save(order);
?? tx.commit();
原因分析:因為在執(zhí)行代碼中,沒有將 customer 和 order 類一對多關(guān)聯(lián)起來,若單獨持久化兩個類: session.save(customer);session.save(order); 則在保存 order 的時候,由于 CUSTOMER_ID 是與 customer 類外鍵,因此無法讀取 customer_id, 而在 order.hbm.xml 中指定其不為空,則產(chǎn)生了以上錯誤。
問題解決:
not-null
=
"true"
改為:not-null="false" 雖然程序無問題,但order表 CUSTOMER_ID為空,不符合邏輯。應(yīng)該將指定其一對多的關(guān)聯(lián)。
order.setCustomer(customer);
????? customer.getOrders().add(order);
2
〉
錯誤顯示:
RROR SessionImpl:2400 - Could not synchronize database state with session
net.sf.hibernate.exception.GenericJDBCException: could not delete collection: [com.Customer.orders#2]
部分原文件:
Session session = sessionFactory.openSession();
??? Transaction tx = null;
??? try {
????? tx = session.beginTransaction();
????? Customer customer=(Customer)session.load(Customer.class,new Long(3));
????? session.delete(customer);
????? tx.commit();
原因分析:因為
cascade
默認(rèn)值為
none
,所以當(dāng)刪除
customer
時,不會自動刪除與其關(guān)聯(lián)的
order
對象。
問題解決:添加語句
cascade
=
"delete"