zoukankan      html  css  js  c++  java
  • Hibernate学习笔记_联合主键

    复合主键(联合主键):多个字段构成唯一性。

    一,xml方式

    1. 将联合主键的属性提取出来,重新编写一个StudentPK类(原Student类中的id,name要删除 并新加入属性“StudentPK”)

    //StudentPK .java
    package
    com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{ private int id; private String name; 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; } @Override public boolean equals(Object o) { if(o instanceof StudentPK) { StudentPK pk = (StudentPK)o; if(this.id == pk.getId() && this.name.equals(pk.getName())) { return true; } } return false; } @Override public int hashCode() { return this.name.hashCode(); } }
    //Student .java
    package com.bjsxt.hibernate;
    
    public class Student {
        
        private StudentPK pk;
        
        private int age;
        private String sex;
        private boolean good;
        public boolean isGood() {
            return good;
        }
        public void setGood(boolean good) {
            this.good = good;
        }
        /*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;
        }*/
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public StudentPK getPk() {
            return pk;
        }
        public void setPk(StudentPK pk) {
            this.pk = pk;
        }
        
        
    }

    注意:

             i.   新建StudentPK 类必须实现 java.io.Serializable 序列化接口(把类对象序列化)

             ii.   新StudentPK 类要重写equals和hashCode方法(保证唯一性)

    2.  联合主键生成策略XML配置方法

    <hibernate-mapping>
        <class name="com.bjsxt.hibernate.Student">
    
            <composite-id name="pk" class="com.bjsxt.hibernate.StudentPK">
                <key-property name="id"></key-property>
                <key-property name="name"></key-property>
            </composite-id>
            
            <property name="age" />
            <property name="sex" />
            <property name="good" type="yes_no"></property>
        </class>
        
    </hibernate-mapping>

     二,Annotation

       1.前三步与Xml方式前三步一样 都要建立新的类 都要实现Serializable接口 重写equals和hashCode方法.

    package com.bjsxt.hibernate;
    
    import javax.persistence.Embeddable;
    
    @Embeddable
    public class TeacherPK implements java.io.Serializable{
        private int id;
        private String name;
        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;
        }
        
        @Override
        public boolean equals(Object o) {
            if(o instanceof TeacherPK) {
                TeacherPK pk = (TeacherPK)o;
                if(this.id == pk.getId() && this.name.equals(pk.getName())) {
                    return true;
                }
            }
            return false;
        }
        
        @Override
        public int hashCode() {
            return this.name.hashCode();
        }
    }
    package com.bjsxt.hibernate;
    
    import java.util.Date;
    
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.EnumType;
    import javax.persistence.Enumerated;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.IdClass;
    import javax.persistence.SequenceGenerator;
    
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.persistence.Transient;
    
    @Entity
    @javax.persistence.TableGenerator(
            name="Teacher_GEN",
            table="GENERATOR_TABLE",
            pkColumnName = "pk_key",
            valueColumnName = "pk_value",
            pkColumnValue="Teacher",
            allocationSize=1
        )
    
    @SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")
    
    public class Teacher {
    
        private TeacherPK pk;
        
        private String title; 
        private String yourWifeName;
        private Date birthDate;
        private boolean good;
        private Gender gender;
        
        
        public Gender getGender() {
            return gender;
        }
        public void setGender(Gender gender) {
            this.gender = gender;
        }
        public boolean isGood() {
            return good;
        }
        public void setGood(boolean good) {
            this.good = good;
        }
        @Transient
        public String getYourWifeName() {
            return yourWifeName;
        }
        public void setYourWifeName(String yourWifeName) {
            this.yourWifeName = yourWifeName;
        }
        
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        @Temporal(TemporalType.TIME)
        public Date getBirthDate() {
            return birthDate;
        }
        public void setBirthDate(Date birthDate) {
            this.birthDate = birthDate;
        }
        
        @Id
        public TeacherPK getPk() {
            return pk;
        }
        public void setPk(TeacherPK pk) {
            this.pk = pk;
        }
    }

     方法一:

     在新类前写@Embeddable,在原类的新属性“TercherPK”的get方法前写@ld,

    //TeacherPK .java
    @Embeddable
    public class TeacherPK implements java.io.Serializable{ private int id; private String name; 。。。。。。。 }
    //Teacher .java
    @Entity
    public class Teacher {
    
        private TeacherPK pk;
    .......................
        
        @Id
        public TeacherPK getPk() {
            return pk;
        }
        public void setPk(TeacherPK pk) {
            this.pk = pk;
        }
    }

    方法2:

    新的TeacherPK 类无需加注解,只需在原Teacher类新属性“TercherPK”的get方法前写@EmbeddedlD即可

    @EmbeddedId
        public TeacherPK getPk() {
            return pk;
        }
        public void setPk(TeacherPK pk) {
            this.pk = pk;
        }

     方法3:

    TeacherPK 类无需加注解,原Teacher类的id,name属性保留不变,也无需新增“TercherPK”属性。 只在id,name的get方法前都加@Id,并在原Teacher类前加“@IdClass(TeacherPK.class)”

    @IdClass(TeacherPK.class)
    public class Teacher {
    
        private int id;
        
        private String name;
        。。。。。
    
        @Id
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        @Id
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    。。。。。。
    }
  • 相关阅读:
    HDU4474 Yet Another Multiple Problem BFS搜索
    HDU4473 Exam 数学分析
    2013ACM多校联合(4)
    POJ1273 网络流...
    HDU4472 Count 递推
    POJ1149 PIGS 网络流
    UVA10881 Piotr's Ants 想法题
    javascript js string.Format()收集
    修改 设置 vs.net 网站 调试 设为 起始页
    【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  • 原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4138579.html
Copyright © 2011-2022 走看看