Hibernate——关联关系的CRUD(增删改查)一

来源:互联网 发布:在淘宝开网店要多少钱 编辑:程序博客网 时间:2024/06/16 18:30

两张ManyToOne双向关联的表Group和User


(一)增

通过保存user把group也保存

@Testpublic void testSaveUser() {User u = new User();Group g = new Group();u.setName("u1");g.setName("g1");u.setGroup(g);Session session = sf.getCurrentSession();session.beginTransaction();session.save(u);session.getTransaction().commit();}

ManyToOne有一个cascade(级联)属性,@ManyToOne(cascade={CascadeType.ALL})

对父表的操作会同步到子表(cascade影响增删改(CUD),不影响读取(R))


通过保存group把user也保存

public void testSaveGroup() {User u1 = new User();User u2 = new User();Group g = new Group();u1.setName("u1");u2.setName("u2");u1.setGroup(g);u2.setGroup(g);g.setName("g1");g.getUsers().add(u1);g.getUsers().add(u2);Session session = sf.getCurrentSession();session.beginTransaction();session.save(g);session.getTransaction().commit();}
@OneToMany(cascade=CascadeType.ALL)
可以看出通过一的这方保存多的这方要麻烦很多



(二)读

默认情况下读取Many的一方会自动把One的一方也取出来,而读取One的一方则不会自动读取Many的一方。

如果想要通过One读取Many,需要

@OneToMany(mappedBy="group",
cascade=CascadeType.ALL,
fetch=FetchType.EAGER)

(尽量不要两边同时设EAGER)

fetch影响读取(R)

@Testpublic void testGet() {testSaveGroup();Session session = sf.getCurrentSession();session.beginTransaction();Group g = (Group)session.get(Group.class, 1);session.getTransaction().commit();for(User u:g.getUsers()){System.out.println(u.getName());}}


如果A和B之间的关联是LAZY而不是EAGER,那么取出A的时候不会取出B,等到使用B时B才会被取出(从数据库到内存)

比如上一段代码,若设置fetch=FetchType.LAZY,则会出现错误,因为session在commit之后已经被关闭,无法从数据库取出user;但在commit之前取出user则可以实现。

原创粉丝点击