1.save 一对多双向
package com.bjsxt.hibernate;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name="t_group")public class Group { ???private int id; ???private String name; ???private Set<User> users = new HashSet<User>(); ???@Id ???@GeneratedValue ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???} ???@OneToMany(mappedBy="group"} ???//只要是增删改查都自动保存 ???????) ???????public Set<User> getUsers() { ???????return users; ???} ???public void setUsers(Set<User> users) { ???????this.users = users; ???}}
Group.java
package com.bjsxt.hibernate;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name="t_user")public class User { ???private int id; ???private String name; ???private Group group; ???@ManyToOne(cascade={CascadeType.ALL}) ???public Group getGroup() { ???????return group; ???} ???public void setGroup(Group group) { ???????this.group = group; ???} ???@Id ???@GeneratedValue ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???}}
test
@Test ???public void testSaveUser() { ???????User u = new User(); ???????u.setName("u1"); ???????Group g = new Group(); ???????g.setName("g1"); ???????u.setGroup(g); ???????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????//s.save(g); ??//如果设置了Csadtype 可以不用先保存g ???????s.save(u); ???????s.getTransaction().commit(); ???} ???
cascade管增删改 fetch管读
从多的一方取 会自动取出少的一方的信息
从少的一方取 不会默认取出多的一方的值 要设置fatch属性为FatchType.EAGER才可以
存少的一方
比如存group
group.java 其他不改
package com.bjsxt.hibernate;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name="t_group")public class Group { ???private int id; ???private String name; ???private Set<User> users = new HashSet<User>(); ???@Id ???@GeneratedValue ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???} ???@OneToMany(mappedBy="group", ???????cascade={CascadeType.ALL} ???????) ???????public Set<User> getUsers() { ???????return users; ???} ???public void setUsers(Set<User> users) { ???????this.users = users; ???}}
test
@Test ???public void testSaveGroup() { ???????User u1 = new User(); ???????u1.setName("u1"); ???????User u2 = new User(); ???????u2.setName("u2"); ???????Group g = new Group(); ???????g.setName("g1"); ???????g.getUsers().add(u1); ???????g.getUsers().add(u2); ???????u1.setGroup(g); ???//必须手动设用户的id号 否则数据库为空值 ???????u2.setGroup(g); ??????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????//s.save(g); ???????s.save(g); ???????s.getTransaction().commit(); ???}
获取到user的时候会默认吧group取出来(1那方)
???@Test ???public void testGetUser() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????User u = (User)s.get(User.class, 1); ???????????????s.getTransaction().commit(); ???????System.out.println(u.getGroup().getName()); ???}
即便去除点cascade也会取掉
测试 取一的地方是否把多的地方取出来? 不会
这样就可以把多的一方也取出来了
当设置多的一方fatch为lazay的时候 hibernate便不自己取出少的一方了
@Test ???public void testGetUser() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????User u = (User)s.get(User.class, 1); ???????//放在这里是可以的 会拿出来一的那一方 ???????s.getTransaction().commit(); ???????System.out.println(u.getGroup().getName()); ?//取不出来 ???}
如果在一的地方取 因为fatch为eager已经自动查出来了 不需要在和数据库打交道了
测试load方法
@Test ???public void testLoadUser() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????User u = (User)s.load(User.class, 1);//返回代理对象 ???????System.out.println(u.getGroup().getName()); ?//这句话发出两个select ???????s.getTransaction().commit(); ???????????}
如果设置fatch为lazy 在找这个对象的时候就不会自动再去找关联的那一方 但是在找另外一方的时候如果是fatch为eager 则又会发出select语句。
update
???@Test ???public void testUpdateUser() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????User u = (User)s.get(User.class, 1); ?//如果user设置为fetch为lazy 则只拿出user 若是eager 则group也拿出来了 ???????????????s.getTransaction().commit(); ??//变为detach态 ???????????????u.setName("user"); ????????//更改名字 缓存中有对象 ???????u.getGroup().setName("group"); ?//拿到group 可见这里的fetch是eager ???????????????Session s2 = sessionFactory.getCurrentSession(); ???????s2.beginTransaction(); ?????????s2.update(u); ?????//更改了u ?????????????????s2.getTransaction().commit(); ?//提交 ???} ???
删除
删除多的一方
@Test ???public void testDeleteUser() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ??????????????????????????????????//User u = (User)s.load(User.class, 1); ??//注释的内容先吧这个对相对应的group设置为null 然后再删除 防止因为删除user 导致删除group 从而删除另外的User ???????//u.setGroup(null); ????????????//也可以用HQL语句 如下所示 ???????//s.delete(u); ?????????????????//也可以设置cascade为非删除 ???????s.createQuery("delete from User u where u.id = 1").executeUpdate(); ??????????s.getTransaction().commit(); ???????????}
删除少的一方
一般来说
删除少的一方
@Test ???public void testDeleteGroup() { ???????????????testSaveGroup(); ???????????????Session s = sessionFactory.getCurrentSession(); ???????s.beginTransaction(); ???????//User u = (User)s.load(User.class, 1); ???????//u.setGroup(null); ???????//s.delete(u); ??//这样会使得user里没有groupid ???????Group g = (Group)s.load(Group.class, 1); ???????s.delete(g); ????//这样回导致删除group以及对应其id的user ???????//s.createQuery("delete from User u where u.id = 1").executeUpdate(); ?//使用HQL语句 ???????s.getTransaction().commit(); ???????????}
Hibernate 再接触 ?CRUD
原文地址:https://www.cnblogs.com/frankzone/p/9601160.html