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