18.Client端的CRUD
1.crud操作需要放在transaction中。
2.crud的操作对象是“java对象”。
3.crud操作之前,通过导航方向按照setXXX设置属性如果是双向导航,则Client端每个导航方向都有设置setXXXX。(双向导航还有一个规律:一方设置mappedBy。防止外键冗余)有2种方式设置:
(1)对导航起始对象和终止对象都执行crud。(多用,一般先操作导航终点对象)
(2)通过设置导航起始类的Cascade属性。只对导航起始对象crud。
4.删除和更新操作要先Load.(变相说明,数据库中有这个记录,有才能更改和删除)
比如:User->Group.
使用(1):
Group group = new Group(); User user = new User(); group.setName("administrator"); user.setName("honbaa"); user.setGroup(group);//设置了:导航起始对象为user,导航终止对象为group Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(group);//保存导航终止对象
session.save(user);//保存导航起始对象 session.getTransaction().commit();
使用(2):
在导航起始类中User设置@ManyToOne的cascade的属性。
@Entity @Table(name="t_user") public class User { private Group group; private int id; private String name; @ManyToOne(cascade={ CascadeType.ALL }) public Group getGroup() { return group; }
Client端只保存导航起始对象。导航终端对象自动保存。
Group group = new Group(); User user = new User(); group.setName("administrator"); user.setName("honbaa"); user.setGroup(group);//设置了:导航起始对象为user,导航终止对象为group Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(user);//保存导航起始对象 //session.save(group);//保存导航终止对象 session.getTransaction().commit();
更新操作
(1)先load,然后set。
session.beginTransaction(); User u = (User) session.get(User.class, 1);//获取一条记录 Group group = (Group)session.get(Group.class, 2);//获取外键表记录 u.setGroup(group);//更新
//更改的是外键值,即u这个记录的“组号”变了 session.getTransaction().commit();
(2)直接update(Object)。
Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); User u = (User) session.get(User.class, 1);//获取一条记录 session.getTransaction().commit(); u.setName("zhanghongxian");//u此时托管 u.getGroup().setName("administrator232");//简单设置cascade的值是CASCADETYPE.ALL //此时更改的是group表的name值 Session session2 = sessionFactory.getCurrentSession(); session2.beginTransaction(); session2.update(u);//根据最新的托管的u对象更新数据库 session2.getTransaction().commit();
删除操作
(1)如果不更改cascadeType.ALL这个值。那么在删除记录的时候,就会将关联的记录也删除。解决方法:设置关联为null
session.beginTransaction(); User u = (User) session.get(User.class, 2);//获取一条记录 u.setGroup(null);//设置关联的对象为null session.delete(u); session.getTransaction().commit();
(2)使用hql
session.beginTransaction(); session.createQuery("delete from User u where u.id=3").executeUpdate(); session.getTransaction().commit();
实际工作中hql非常频繁的使用!!