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