精华内容
下载资源
问答
  • SpringData JPA复合主键

    2019-04-19 20:38:12
    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的...复合主键:一张表存在多个字段共同组成一个主键,这多个字段的组合不能重复,但是单独一个可以重复。 例子:姓名和省份证号共同组成了主键 ...

    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下。确定一个人,不能只根据他的姓名来确定,因为会有重名,现在我们假设姓名、身份证号确定唯一一个人。

    复合主键:一张表存在多个字段共同组成一个主键,这多个字段的组合不能重复,但是单独一个可以重复。

    例子:姓名和省份证号共同组成了主键

    二、采用@IdClass来注解复合主键

    过程和@Embeddable差不多,这里直接贴例子。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    @Entity

    @Table(name = "people")

    @IdClass(PeopleKey.class)

    public class People  implements Serializable {

     

    //  @EmbeddedId

    //  private PeopleKey id;

         

        @Id

        @Column(name = "name")

        private String name;

        @Id

        @Column(name = "idcardno")

        private String idcardno;

         

        @Column(name = "age")

        private int age;

         

        @Column(name = "address")

        private String address;

     

    }

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    public class PeopleKey implements Serializable  {

    //  @Id

    //  @Column(name = "name")

        private String name;

    //  @Id

    //  @Column(name = "idcardno")

        private String idcardno;

     

    }

    采用这个方法的我参考博客里有一篇,写的比较详细,但是感觉这个方法不好,本身就已经在PeopleKey中把主键给封装了,但是在实体类People中还要把复合主键给加入进去,不够简介,采用第一种方法,就很简单,而且也体现了Java类封装的思想。

     一、Spring Data Jpa 复合主键  

    1.1、编写一个复合主键类:PeopleKey 

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    @Embeddable

    public class PeopleKey implements Serializable  {

         

        @Column(name = "name")

        private String name;

         

        @Column(name = "idcardno")

        private String idcardno;

        // 省略setter,getter方法

     

        @Override

        public String toString() {

            return "PeopleKey [name=" + name + ", idcardno=" + idcardno + "]";

        }

    } 

      注意:  

      1) 实现Serializable接口(否则会报错,错误会直接显示); 

      2)在复合主键的类上,使用注解@Embeddable

      3) 有默认的public无参数的构造方法(在我这个实例中,我没有添加有参构造方法,所以采用默认的构造方法)

      如果你在实体类里有有参构造方法,那么一定要有一个无参构造方法,否则运行的时候会报错

    1

    org.hibernate.InstantiationException: No default constructor for entity:  : com.my.model.People

    这个就是没有默认的构造方法造成的,所以要在实体类中加入默认的无参构造方法。

      4) 重写equalshashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码(我验证EntityManger,不重写也没事。);

    1.2、编写实体类:People 

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    package com.my.model;

     

    import javax.persistence.*;

    @Entity

    @Table(name = "people")

    //@IdClass(PeopleKey.class)

    public class People extends PeopleKey{

        // 复合主键要用这个注解

        @EmbeddedId

        private PeopleKey id;

     

        @Column(name = "age")

        private int age;

         

        @Column(name = "address")

        private String address;

     

        // 省略setter,getter方法

        @Override

        public String toString() {

            return "People [id=" + id + ", age=" + age + ", address=" + address

                    "]";

        }  

    }

    1.3 测试:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    @Service

    public class PeopleService {

         

        @Resource

        private PeopleRepository peopleRepository;

     

        public People findOne() {

            PeopleKey peopleKey = new PeopleKey();

            peopleKey.setName("张三");

            peopleKey.setIdcardno("340123");

            People people = peopleRepository.findOne(peopleKey);

            return people;

        }

     

    }

    控制台上的输出结果:

    1

    People [id=PeopleKey [name=张三, idcardno=340123], age=3, address=分解分] 

     

     三、EntityManager的验证,直接上代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    package com.my.model;

     

    import java.io.Serializable;

     

    import javax.persistence.Column;

    import javax.persistence.Embeddable;

    import javax.persistence.Entity;

    import javax.persistence.Id;

    //@Embeddable

    public class PeopleKey implements Serializable  {

    //  @Id

    //  @Column(name = "name")

        private String name;

    //  @Id

    //  @Column(name = "idcardno")

        private String idcardno;

         

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public String getIdcardno() {

            return idcardno;

        }

        public void setIdcardno(String idcardno) {

            this.idcardno = idcardno;

        }

     

        @Override

        public String toString() {

            return "PeopleKey [name=" + name + ", idcardno=" + idcardno + "]";

        }  

     

    }

      

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    package com.my.model;

     

    import java.io.Serializable;

     

    import javax.persistence.*;

    @Entity

    @Table(name = "people")

    @IdClass(PeopleKey.class)

    public class People  {

     

    //  @EmbeddedId

    //  private PeopleKey id;

         

     

        @Column(name = "age")

        private int age;

         

        @Column(name = "address")

        private String address;

     

    //  public PeopleKey getId() {

    //      return id;

    //  }

    //

    //  public void setId(PeopleKey id) {

    //      this.id = id;

    //  }

    // 

        @Id

        @Column(name = "name")

        private String name;

        @Id

        @Column(name = "idcardno")

        private String idcardno;

         

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public String getIdcardno() {

            return idcardno;

        }

        public void setIdcardno(String idcardno) {

            this.idcardno = idcardno;

        }

        public int getAge() {

            return age;

        }

     

        public People() {

            super();

        }

     

        public void setAge(int age) {

            this.age = age;

        }

     

     

        public String getAddress() {

            return address;

        }

     

        public void setAddress(String address) {

            this.address = address;

        }

     

        @Override

        public String toString() {

            return "People [age=" + age + ", address=" + address + ", name=" + name

                    ", idcardno=" + idcardno + "]";

        }

         

         

    }<br><br>

    测试:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    @RequestMapping(value = "/useEntityManager")

    public void findUseEntityManager() throws Exception

       {

           PeopleKey peopleKey = new PeopleKey();

           peopleKey.setName("张三");

           peopleKey.setIdcardno("340123");

            People people = entityManager.find(People.class,peopleKey);

            System.out.println(people.toString());

       } 

     结果:

    1

    People [age=3, address=分解分, name=张三, idcardno=340123]

     

    参考网址:

    1、https://www.cnblogs.com/linjiqin/archive/2011/03/09/1978680.html

    2、http://blog.csdn.net/qq_35056292/article/details/77892012 

    3. https://www.cnblogs.com/boywwj/p/8031106.html

    展开全文
  • SQL多表操作

    2018-02-10 15:19:05
    数据库–多表操作 第一部分:的关系 常见的的关系: 1.一对关系 ... 建表原则:创建一张中间(作为从),该中间至少要字段,这两字段作为外键分别指向另外两张的主...

    数据库–多表操作

    第一部分:表与表的关系

    常见的表与表的关系:
    1.一对多关系
        常见例子:班级与学生,分类与商品,部門与员工
        建表原则:在从表(多的一方)中创建一个字段,该字段作为一个外键指向主表(一的一方)的主键。
    2.多对多关系
        常见例子:商品与订单
        建表原则:创建一张中间表(作为从表),该中间表至少要有两个字段,这两个字段作为外键分别指向另外两张表的主键。(即将一个多对多拆分为两个一对多)。
    3.外键
        外键是一种约束关系。
        声明外键约束:
            alter table 从表名 add 外键名称 foreign key(从表的外键字段名) references 主表(主键字段);
    

    第二部分:多表查询

    1.交叉连接查询(得到两张表的乘积)
        语法:select * from A,B;
    2.内连接查询
        隐式内连接查询:select * from A,B where 条件;
        显示内连接查询:select * from A join B on 条件;
        注:内连接查询结果是两张表有交集的部分。
    3.外连接查询
        左外连接查询: left join
            语法:select * from A left join B on 条件;
        右外连接查询: right join  
            语法:select * from A right join B on 条件;
        注:左外连接的查询结果为左边的表和两张表的交集部分;右外连接的查询结果为右边的表和两张表的交集部分。
    
    展开全文
  • mysql学习(5):多表之间的关系

    千次阅读 2016-12-31 17:29:53
    这种关系即多个表具有相同的主键,实际中用的并不多,因为完全可以将这种关系的合并为同一张表。 2,一对多(多对一)的关系 其中表1的主键是表2的外键(即表1的某字段作为主键,表2的相同字段字段绑定到表1的主键...

    mysql相互关联的表之间存在一对一,一对多(多对一),多对多的关系。

    1,一对一的关系

    这种关系即多个表具有相同的主键,实际中用的并不多,因为完全可以将这种关系的合并为同一张表。

    2,一对多(多对一)的关系

    其中表1的主键是表2的外键(即表1的某字段作为主键,表2的相同字段字段绑定到表1的主键字段上),举个简单的例子:

    有学生表和成绩表如下:

    CREATE TABLE stu(
    	stuId INT,
    	name VARCHAR(10) NOT NULL,
    	PRIMARY KEY(stuId)
    );
    CREATE TABLE score(
    	stuId INT,
    	score INT,
    	FOREIGN KEY (stuId) REFERENCES stu(stuId)
    );

    stu表中以stuId为主键。score表中同样有stuId字段,将两个stuId字段相关联。


    FOREIGN KEY (stuId) REFERENCES stu(stuId)  //这句话表示将当前表的stuId字段关联到stu表的stuId字段,作为stu表的外键

    于是,两张表就产生了关系:


    (1)在创建数据时,要先在stu表中指定stuId,才能在score表中添加对应stuId的成绩。反之,想要在score表中创建stuId(而stu表中没有该stuId)的话,就会报错。

    (2)在删除表时,要先删除score表,再删stu表。反之会报错。

    3,多对多的关系

    这种关系在实际中也很常见,比如:一个老师教很多学生的课,一个学生选了很多老师的课。那么,老师和学生之间就是多对多的关系。

    多对多的关系要借助于第3张表。举个简单的例子:

    (1)首先创建老师表,设置id为主键

    CREATE TABLE teacher(
    	teacherId INT,
    	NAME VARCHAR(10) NOT NULL,
    	PRIMARY KEY(teacherId)
    );
    (2)然后创建学生表,同样设置id为主键

    CREATE TABLE stu(
    	stuId INT,
    	NAME VARCHAR(10) NOT NULL,
    	PRIMARY KEY(stuId)
    );
    (3)最后创建一张表,将前两张表关系起来,如创建一个课程表:

    CREATE TABLE score(
    	stuId INT,
    	teacherId INT,
    	FOREIGN KEY (stuId) REFERENCES stu(stuId),
    	FOREIGN KEY (teacherId) REFERENCES teacher(teacherId)
    );
    将课程表的字段分别设置为教师表和学生表的外键,关系如下:


    这样就可以形成多对多的关系了,使用方法同一对多。

    (1)首先保证教师表和学生表中有数据,再创建课程表中的数据。

    (2)删除表时,先删除课程表,再删除其他表。

    展开全文
  • Android Sqlite数据库多表联合查询

    千次阅读 2018-06-11 00:41:36
    工作上用数据库存储文件还是很便利的,所以时候发现一张表存储数据感觉数据结构不是很清晰的时候,就需要新加第二张表或者张表来进行联合查询对象信,一般是用键将彼此联系起来,在表中,每个主键的值都是唯一的...

    Android Sqlite数据库多表联合查询示例

    工作上用数据库存储文件还是很便利的,所以有时候发现一张表存储数据感觉数据结构不是很清晰的时候,就需要新加第二张表或者多张表来进行联合查询对象信,一般是用键将彼此联系起来,在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起,下面,写一点简单的例子:
    先说一下两张表各自要展现的内容有哪些
    第一张表:

    CREATE TABLE [custoly](
        [CustNo] INTEGER PRIMARY KEY, 
        [Last_Name] CHAR(30), 
        [First_Name] CHAR(30), 
        [VIP_Status] CHAR(10), 
        [Address1] CHAR(40), 
        [Address2] CHAR(40), 
        [City] CHAR(20), 
        [State_Prov] CHAR(10), 
        [Post_Code] CHAR(10), 
        [Country] CHAR(10), 
        [Phone] CHAR(18), 
        [Fax] CHAR(18), 
        [EMail] CHAR(40), 
        [Remarks] CHAR);
    

    这里写图片描述

    第二张表:

    CREATE TABLE [customer](
        [CustNo] INTEGER PRIMARY KEY, 
        [Company] CHAR(30), 
        [Addr1] CHAR(30), 
        [Addr2] CHAR(30), 
        [City] CHAR(15), 
        [State] CHAR(20), 
        [Zip] CHAR(10), 
        [Country] CHAR(20), 
        [Phone] CHAR(15), 
        [FAX] CHAR(15), 
        [TaxRate] FLOAT, 
        [Contact] CHAR(20), 
        [LastInvoiceDate] DATETIME);
    

    这里写图片描述
    两张表的联系是有相同的CustNo,请留意,”CustNo” 列把上面的两个表联系了起来

    下面进行关联查询:

    SELECT customer.LastInvoiceDate 
    FROM custoly
    INNER JOIN customer
    ON custoly.CustNo = 86433 AND customer.CustNo = 86433 
    ORDER BY customer.TaxRate
    

    查询结果意图如下:
    这里写图片描述

    这里写图片描述

    展开全文
  • oracle 主键自增 sequence

    2010-07-27 23:34:55
    首先,你要有一张表! CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(10), ADDRESS VARCHAR(50) ); 然后,你需要一自定义的sequence CREATE SEQUENCE emp_...
  • 由于关系中不能在两关系表中插入对应的主键作为外键,所以要新建一张表来维护两者的关系我用支援和职位的背景作为Demo实例数据库表与实体表的模型图用户表的对应关系角色表的对应关系配置实体映射的文件User...
  • MySQL_之间的关系

    千次阅读 2020-06-30 11:38:11
    文章目录概述一对一一对多多对多 概述 之间的关系有三种:一对一、一对多(多对一)、多对多 ...列子:用户(user),订单(order),一个用户可以有多个订单数据 用户(user) 使用1对1例子
  • 时候我们需要给一类或者类中的成员加上一些属性或者附加信息,让类或者变量的功能更明确可控制的细粒度更高,打简单的比方:数据库里面的一张表,表中的每一字段都属性,如是否主键,默认值,注释...
  • 一个库中可以存在多个表 具体来看每一张表的情况 以表格为例子 》表格 》主键 一行信息的唯一标识 特点: 非空 唯一 》数据类型 总的分三种类型 数字类型 时间类型 字符串类型 == 整数类型的理解 ...
  • SQL学习十、联结

    2018-10-25 08:51:45
    比如我们这样一张水果订单oderlist,中每一行是一水果订单,里面包含(主键id、水果名、数量、单价、订单号、用户id、用户名称、订单时间、水果供应商、供应商地址、供应商电话、供应商邮箱、供应商联系人)...
  • 前言 ...一个用户可以有多个角色 一个角色可以赋予多个用户 在进行多查询时,我们需要一张中间,中间中包含各自的主键,在中间中是外键。 多对多查询(xml方式) 这次我们首...
  • 时候我们需要给一类或者类中的成员加上一些属性或者附加信息,让类或者变量的功能更明确可控制的细粒度更高,打简单的比方:数据库里面的一张表,表中的每一字段都属性,如是否主键,默认值,注释信息...
  • 数据库之间的关系 1.一对一(很少,了解): ...上面是学生和课程之间的的关系,建表原则为建立一张中间,中间中至少两字段,这两字段同时作为主键和外键,外键分别对应学生和课程...
  • 1 """ 2 什么时候用主键?... 4 一张表只能有一个主键 5 一个主键只能是一列吗?错的 可以有多列 6 7 例子: 8 create table t1( 9 nid int(11) not null auto_increment primary key, 10...
  • 这就是“一张原始单证对应多个实体”的典型例子主键与外键 一般的来说一个实体不能即无主键也无外键,在E-R图中处于叶子部位的实体可以定义主键但是必须要定义外键 因为必须要父级才可以 基本的性质 ​ ...
  • MySQL外键约束

    2019-07-28 14:44:22
    外键在同一张表中可以有多个外键存在,而主键PK只能有一个 举个例子来说明外键约束,创建学生表和班级表,通过学生的编号来查询他所在的班级。 drop table if exists t_student; create table t_student( sno ...
  • 数据库的完整性约束

    2019-05-28 10:36:29
    primary key:candidate key中人工选择一个(一张表只能一个或多个组成的联合主键) 举个例子:例如students表,含有字段stu_number(学号)id(身份证号)name(姓名) 那么找出所有能够...
  • 之前我们介绍了hibernate中怎样配置一对的关系,现在我们在来进一步讨论下对...与一对不同的是实现需要引入一张链接 在该pid和rid两复合主键  在关系中同样单项和双向的关系。  就单向关
  • 自关联

    2020-02-19 15:02:10
    自关联的作用就是能够将联系的张表合成为一张表,从而节省空间。 代码演示: 自关联是一特殊的一对的关系 所以还是使用ForeignKey做外键 举个例子: 上面的代码就是使用的这省市区的例子,采取自关联...
  • JPA的Secondary table

    2006-11-14 10:32:23
    @SecondaryTable,@SecondaryTables允许你把一entity映射...这三属性构成了顾客的地址,我们希望把此 3属性映射到另一张表上,作为主表的从表,此表跟主表就是一对一关系,通过address_id进行主键关联.那么,我们...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

一张表有多个主键例子