1. 程式人生 > >hibernate的list集合對映(與set區別)

hibernate的list集合對映(與set區別)

ref:http://blog.csdn.net/longyuan20102011/article/details/7722693

主要區別

set沒有順序,也不允許重複。可以級聯儲存
 list可以允許重複,有次序。但沒有級聯一說,所以必須每個物件各自儲存各自的

department中:

  <list name="employees">
<key column="depart_id"/>
<list-index column="order_col"/>  //會在employee中多出個欄位
<one-to-many class="Employee"/>
</list>

java程式碼:

static void add() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//Department dep=(Department)session.get(Department.class, 1);

Department depart = new Department();
depart.setName("depart"+new Date().toLocaleString());


List emps = new ArrayList();
//Set emps = new HashSet();
Employee emp = new Employee();
emp.setName("emp name:jimmy "+new Date().toLocaleString());
emp.setAge(10);
emp.setDepart(depart);


Employee emp1 = new Employee();
emp1.setName("emp name:kaka"+new Date().toLocaleString());
emp1.setAge(10);


emp1.setDepart(depart);


emps.add(emp1);
emps.add(emp);

depart.setEmployees(emps);
session.save(emp);   
session.save(emp1);  //注意除錯時候,這句和上句並沒有輸出sql語句
session.save(depart);  //注意除錯時候,這句這句輸出三句sql:

//insert into employees (name, age, depart_id, id) values (?, ?, ?, ?)
//insert into employees (name, age, depart_id, id) values (?, ?, ?, ?)
//insert into departments (name) values (?)

//*/

tx.commit();           //注意除錯時候,這句這句輸出四句sql:

//update employees set name=?, age=?, depart_id=? where id=?
//update employees set name=?, age=?, depart_id=? where id=?
//update employees set depart_id=?, order_col=? where id=?
//update employees set depart_id=?, order_col=? where id=?
} finally {


if (session != null)
session.close();
}
}

輸出:

Hibernate: select next_hi from hibernate_unique_key for update
Hibernate: update hibernate_unique_key set next_hi = ? where next_hi = ?
Hibernate: insert into employees (name, age, depart_id, id) values (?, ?, ?, ?)
Hibernate: insert into employees (name, age, depart_id, id) values (?, ?, ?, ?)
Hibernate: insert into departments (name) values (?)
Hibernate: update employees set name=?, age=?, depart_id=? where id=?
Hibernate: update employees set name=?, age=?, depart_id=? where id=?
Hibernate: update employees set depart_id=?, order_col=? where id=?
Hibernate: update employees set depart_id=?, order_col=? where id=?

資料庫:

id   name                                                      age depart_id  order_id

'1', 'emp name:jimmy 2015-8-20 12:19:18', '10',     '4',           '1'
'2', 'emp name:kaka  2015-8-20 12:19:18', '10',     '4',            '0'

問:如果沒有 session.save(emp);    session.save(emp1);這兩句會怎麼樣?

答:會報錯,Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance,同時輸出

Hibernate: insert into departments (name) values (?)
Hibernate: update employees set depart_id=?, order_col=? where id=?   //可見session.save(depart);是直接更新employees