1 hibernate关联关系
1.1 一对一关联(CardBean关联person 一张身份证只能属于一个人)
1.1.1 Bean
@Entity
@Table(name = "T_Card")
public class CardBean implements Serializable {
@Id
private intuser_id;
private String cardnum;
private String cardtime;
private String publish;
@OneToOne
//@JoinColumn(name="user_id")
/**
* PrimaryKeyJoinColumn:表示把cardBean中的主键(user_id)做为与PersonBean中的主键来关联。
*
* 如果2个对象不是用主键来关联,那么要使用JoinColumn这个注解。
*/
@PrimaryKeyJoinColumn
private PersonBean personBean;
//省略set,get
}
@Entity
@Table(name = "T_Userinfo")
public class PersonBean implements java.io.Serializable {
@Id
private Integer userid;
private String username;
private String password;
}
1.1.2 Save
PersonBeanpersonBean = new PersonBean();
personBean.setUserid(new Integer(userid));
personBean.setUsername(username);
personBean.setTruename(truename);
personBean.setUsersex(usersex);
session.save(personBean);
CardBeancardBean = new CardBean();
cardBean.setUser_id(new Integer(userid).intValue());
cardBean.setCardnum(cardnum);
cardBean.setCardtime(cardtime);
cardBean.setPublish(publish);
session.save(cardBean);
1.1.3 Delete
CardBeancardBean = (CardBean) session.get(CardBean.class,
new Integer(userid));
/**
* 默认也不级联删除PersonBean对象。
*
* A:配置级联删除
*
* B:代码中删除
*/
PersonBeanpersonBean = cardBean.getPersonBean();
session.delete(personBean);
session.delete(cardBean);
1.2 一对多关联(classes与students关联一个班级中有多个学生)
1.2.1 Bean
@Entity
@Table(name = "T_Classes")
public class ClassesBean implements Serializable {
@Id
private Integer classesid;
private String classesname;
@OneToMany
@JoinColumn(name = "classes_id")
@OrderBy(value = "studentidasc,studentname desc")
private Set<StudentBean> studentSet = new HashSet<StudentBean>();
@OneToMany
@JoinColumn(name = "classes_id")
@OrderBy(value = "studentnamedesc")
private List<StudentBean> studentList = newArrayList<StudentBean>();
}
@Entity
@Table(name = "T_CLASSES_STUDENT")
public class StudentBean implements Serializable {
@Id
private Integer studentid;
private String studentname;
private String studentage;
private Integer classes_id;
private Integer index_id;
}
1.2.2 Save_1
ClassesBeanclassesBean = new ClassesBean();
/**
* 创建学生对象
*
* 学生要关联对应的班级中。
*
* A:让班级对象来维护班级中的学生集合。Set/List中加入学生对象。
*
* B:创建学生对象时,直接在学生对象中的classes_id中直接指定对应的班级对象。
*
*/
Set<StudentBean>studentSet = new HashSet<StudentBean>();
for (int i = 0; i < studentid_Array.length; i++) {
Stringstudent_id = studentid_Array[i];
Stringstudent_name = studentname_Array[i];
Stringstudent_age = studentage_Array[i];
StudentBeanstudentBean = new StudentBean();
studentBean.setStudentid(new Integer(student_id));
studentBean.setStudentname(student_name);
studentBean.setStudentage(student_age);
session.save(studentBean);
studentSet.add(studentBean);
}
/**
* 创建班级对象
*/
classesBean.setClassesid(new Integer(classesid));
classesBean.setClassesname(classesname);
classesBean.setStudentSet(studentSet);
session.save(classesBean);
tx.commit();
1.2.3 save_2
ClassesBean classesBean = new ClassesBean();
classesBean.setClassesid(new Integer(classesid));
classesBean.setClassesname(classesname);
// 返回主键。
Serializableclasses_primayID = session.save(classesBean);
for(int i = 0; i < studentid_Array.length; i++) {
Stringstudent_id = studentid_Array[i];
Stringstudent_name = studentname_Array[i];
Stringstudent_age = studentage_Array[i];
StudentBeanstudentBean = new StudentBean();
studentBean.setStudentid(new Integer(student_id));
studentBean.setStudentname(student_name);
studentBean.setStudentage(student_age);
/**
* 学生记住班级的ID号。
*/
studentBean.setClasses_id((Integer)classes_primayID);
session.save(studentBean);
}
1.2.4 Delete
ClassesBeanclassesBean = (ClassesBean)session.get(
ClassesBean.class, new Integer(classesid));
/**
* 一对多的关联关系中。删除One的一方,不会级联删除多的一方。
*
* 级联删除:
*
* A:配置级联删除。@OneToMany(cascade=CascadeType.REMOVE)
* import javax.persistence.CascadeType;不要导错包
* B:代码删除。
*
* 方案1:循环删除。
*
* 方案2:HQL中直接使用Delete语句。
*/
// Set<StudentBean>studentSet = classesBean.getStudentSet();
// for(StudentBean studentBean:studentSet){
// session.delete(studentBean);
// }
StringdeleteSQL = "DeleteFrom StudentBean where classes_id = "
+classesid + "";
query= session.createQuery(deleteSQL);
query.executeUpdate();
session.delete(classesBean);
1.3 多对一关联
1.3.1 Bean
@Entity
@Table(name = "T_Group")
public class GroupBean implements Serializable {
@Id
private Integer groupid;
private String groupname;
}
@Entity
@Table(name = "T_GroupUser")
public class GroupUser implements Serializable {
@Id
private Integer userid;
private String username;
// private Integer group_id;
@ManyToOne
/**
* JoinColumn表示是使用Many这一方的group_id与One一方的主键(groupid)来进行关联。
*
* 加了JoinColumn属性后,原来的成员变量group_id就必须去掉。否则会产生重复的字段操作。
*/
@JoinColumn(name = "group_id")
private GroupBean groupBean;
}
1.3.2 Save
与一对多一样
1.3.3 Delete
GroupUser user = (GroupUser)session.get(GroupUser.class,
new Integer(param_userid));
if (user != null){
/**
* many_to_one的删除操作:默认只删除多的数据。One的数据没有删除。
*
* 如果希望One的数据也需要删除:
*
* 1:配置上删除。@ManyToOne(cascade=CascadeType.REMOVE)
*
* 2:代码上删除。
*/
GroupBeangroupBean = user.getGroupBean();
session.delete(groupBean);
session.delete(user);
1.4 多对多关联(role与menu关联,一个菜单可以分配给多名角色,一个角色可以有多个菜单)
多对多关联不能够直接建表,必须要拆分成两个一对多才行,而且hibernate不提供直接操作中间表的操作,中间表由两个表的主键组成。
1.4.1 Bean
@Entity
@Table(name = "T_Sys_Menu")
public class MenuBean implements java.io.Serializable {
@Id
private String menu_id;
private String menu_name;
private String menu_href;
private String menu_target;
private String parentid;
private Integer grade;
private Integer isleaf;
@ManyToMany
@JoinTable(name = "T_Sys_Role_Menu", joinColumns = { @JoinColumn(name = "menuid") }, inverseJoinColumns = { @JoinColumn(name = "roleid") })
@OrderBy(value="role_id asc")
private Set<RoleBean> roleSet = new HashSet<RoleBean>();
}
@Entity
@Table(name = "T_Sys_Role")
public class RoleBean implements Serializable {
@Id
private String role_id;
private String role_name;
private String role_remark;
@ManyToMany
@JoinTable(name = "T_Sys_Role_Menu", joinColumns = @JoinColumn(name = "roleid"), inverseJoinColumns = @JoinColumn(name = "menuid"))
/**
* Order by排序的字段必须是MenuBean对应的表中的字段。
*/
@OrderBy(value="menu_idasc")
private Set<MenuBean> menuList = new HashSet<MenuBean>();
}
1.4.2 Save
tx = session.beginTransaction();
RoleBeanroleBean = new RoleBean();
roleBean.setRole_id(role_id);
roleBean.setRole_name(role_name);
Set<MenuBean>menuSet = roleBean.getMenuList();
for(String menu_id : menu_idArray) {
MenuBeanmenuBean = (MenuBean) session.get(MenuBean.class,
menu_id);
menuSet.add(menuBean);
}
session.save(roleBean);
tx.commit();
1.4.3 delete
tx= session.beginTransaction();
RoleBeanroleBean = (RoleBean) session.get(RoleBean.class,
param_role_id);
if (roleBean != null){
/**
* 多对多对级联删除中间表中的数据。
*/
session.delete(roleBean);
}
tx.commit();