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非常频繁的使用!!

posted @ 2013-10-16 20:13  FishBird  阅读(186)  评论(0编辑  收藏  举报