hibernate关联关系

来源:互联网 发布:ubuntu查看ip 编辑:程序博客网 时间:2024/06/06 03:51

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;

   //省略setget

}

 

@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:循环删除。

             *

             * 方案2HQL中直接使用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_idOne一方的主键(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();


0 0