首先,我們建立兩個實體類: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工具類