Transaction tx = null;
try {
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();
idOfJack=customer.getId();
idOfJackOrder=order.getId();
}catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
public void deleteCustomer(Long customerId){
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,customerId);
session.delete(customer);
tx.commit();
}catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
public void removeOrderFromCustomer(Long customerId){
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,customerId);
Order order=(Order)customer.getOrders().iterator().next();
// Customer Order
customer.getOrders().remove(order);
order.setCustomer(null);
tx.commit();
}catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
public void printOrders(Set orders){
for (Iterator it = orders.iterator(); it.hasNext();) {
Order order=(Order)it.next();
System.out.println("OrderNumber of "+order.getCustomer().getName()+ " :"+order.getOrderNumber());
}
}
public void saveCustomerAndOrderWithInverse(){
saveCustomerAndOrderSeparately();
associateCustomerAndOrder();
}
public void test(){
saveCustomerAndOrderWithCascade();
saveCustomerAndOrderWithInverse();
printOrdersOfCustomer(idOfTom);
deleteCustomer(idOfJack);
removeOrderFromCustomer(idOfTom);
}
public static void main(String args[]){
new BusinessService().test();
sessionFactory.close();
}
}
由以上代码执行时的效率和打印的sql语句,我们可以得出以下经验:1.应把one的一方的
Java代码
order.setCustomer(customer);
customer.getOrders().add(order);
这样会是程序更加健壮,提高业务逻辑的独立性,使代码不收hibernate实现的影像。同理,当解除双向关联关系时,也该操作关联双发的对应属性,如:
Java代码
customer.getOrders().remove(order);
order.setCustomer(null);