天天看點

Hibernate5多對多單向CRUD操作

首先,我們建立兩個實體類:User和Role,每個使用者對應多個角色,每個角色也對應多個使用者。

User實體類

@Entity
public class User {
 
   private int id;
   private String name;
   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   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;
   }
}
           

Role實體類

@Entity
public class Role {
 
   private int id;
   private String name;
   private List<User> list=new ArrayList<User>();
  
   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   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;
   }
 
   @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
   public List<User> getList() {
       return list;
   }
 
   public void setList(List<User> list) {
       this.list = list;
   }
}
           

這裡注意兩個實體類中 @GeneratedValue 注解要加上(strategy=GenerationType.IDENTITY),意思是使用資料庫自增主鍵。不加的話就是使用hibernate自增主鍵,後者計算的是兩個表的id,比如向User表插入一條資料,id為1,再向Role表插入一條資料,此時這條Role中的資料id就是2了。

我們先進行資料庫添加操作

public void createAndStoreUser() {
       Session session = HibernateUtil.getSessionFactory().getCurrentSession();
       session.beginTransaction();
       User user1 = new User();
       User user2 = new User();
       user1.setName("user1");
       user2.setName("user2");
 
       Role role1 = new Role();
       Role role2 = new Role();
       Role role3 = new Role();
       role1.setName("role1");
       role2.setName("role2");
       role3.setName("role3");
 
       role1.getList().add(user1);
       role1.getList().add(user2);
 
       role2.getList().add(user1);
       role2.getList().add(user2);
 
       role3.getList().add(user1);
       role3.getList().add(user2);
 
       session.save(user1);
       session.save(user2);
       session.save(role1);
       session.save(role2);
       session.save(role3);
       session.getTransaction().commit();
       HibernateUtil.getSessionFactory().close();
	}
           

單表查詢操作

public void queryUserSingelTable() {
	       Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	       session.beginTransaction();
	       Query query = session.createQuery("from User where id>3 and id<7");
	       List<User> users = (List<User>) query.list();
	       for (User user : users) {
	           System.out.println(user.getName());
	       }
	       session.getTransaction().commit();
	       HibernateUtil.getSessionFactory().close();
	 }
           

兩個表聯合查詢

public void queryTwoTable() {
	       Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	       session.beginTransaction();
	       Query query = session.createQuery("from Role where id>3 and id<7");
	       List<Role> roles = query.list();
	       for (Role role : roles) {
	           System.out.println(role.getName());
	           List<User> users = role.getList();
	           for (User user : users) {
	               System.out.println(user.getName());
	           }
	       }
	 
	       session.getTransaction().commit();
	       HibernateUtil.getSessionFactory().close();
	   }
           

這裡注意,要在Role ManyToMany注解上添加fetch = FetchType.EAGER,否則的話查不到User的資料。

User表的更新操作

   public void updateUser() {
	       Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	       session.beginTransaction();
	       User user = (User) session.get(User.class, 2);
	       user.setName("xiaohong");
	       session.save(user);
	       session.getTransaction().commit();
	       HibernateUtil.getSessionFactory().close();
	   }
           

從Role表進行删除操作

   public void deleteUser() {
	       Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	       session.beginTransaction();
	       Role role = session.get(Role.class, 4);
	       session.delete(role);
	       session.getTransaction().commit();
	       HibernateUtil.getSessionFactory().close();
	   }
           

和級聯查詢一樣,需要在ManyToMany注解上添加cascade = CascadeType.REMOVE,否則的話隻能删除Role表中的資料,User表中的資料不會被删除。

hibernate工具類