精华内容
下载资源
问答
  • 前言想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是虫虫:为了方便小白 虫虫把关联表的查询方式总结了关联查询种类等值连接、...

    前言

    想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是

    虫虫:为了方便小白 虫虫把关联表的查询方式总结了

    关联查询种类

    等值连接、自然连接、内连接、自连接、左外连接、右外连接、全连接

    实验用表

    本次用到的表有test表和user表,下面是两个表的sql代码

    SET NAMES utf8mb4;

    SET FOREIGN_KEY_CHECKS = 0;

    -- ----------------------------

    -- Table structure for test

    -- ----------------------------

    DROP TABLE IF EXISTS `test`;

    CREATE TABLE `test` (

    `location_id` int(11) DEFAULT NULL,

    `location_name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,

    INDEX `name_index`(`location_name`) USING BTREE

    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

    -- ----------------------------

    -- Records of test

    -- ----------------------------

    INSERT INTO `test` VALUES (1, 'UK');

    INSERT INTO `test` VALUES (2, 'US');

    INSERT INTO `test` VALUES (3, 'Chain');

    SET FOREIGN_KEY_CHECKS = 1;

    SET NAMES utf8mb4;

    SET FOREIGN_KEY_CHECKS = 0;

    -- ----------------------------

    -- Table structure for user

    -- ----------------------------

    DROP TABLE IF EXISTS `user`;

    CREATE TABLE `user` (

    `id` int(11) NOT NULL,

    `username` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,

    `birthday` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,

    `sex` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,

    `location_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL

    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

    -- ----------------------------

    -- Records of user

    -- ----------------------------

    INSERT INTO `user` VALUES (1, 'Tom', '1', 'boy', 'UK');

    INSERT INTO `user` VALUES (2, 'Bob', '2', 'boy', 'US');

    INSERT INTO `user` VALUES (4, 'Worm', '4', 'boy', 'Chain');

    SET FOREIGN_KEY_CHECKS = 1;

    等值连接

    使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列。

    select * from test t,user u where t.location_id=u.id

    结果:

    自然连接

    进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。

    1.等值连接中不要求属性值完全相同,而自然连接要求两个关系中进行比较的必须是相同的属性组(属性名可以不同),即要求必须有相同的值域。

    2.等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

    select * from test t natural join user u

    结果:

    内连接

    内连接与等值连接是同一件事,只是内连接是由SQL 1999规则定的书写方式。两个说的是一码事。

    select * from test t join user u on t.location_id=u.id

    你可以可以加上inner

    select * from test t inner join user u on t.location_id=u.id

    结果:

    自连接

    自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

    select * from user t join user u on t.sex=u.sex

    结果:

    左外连接

    左向外联接的结果集包括 left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

    select * from test t left join user u on t.location_id=u.id

    结果:

    右外连接

    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    select t.*,u.* from test t right join user u on t.location_id=u.id

    结果:

    全连接(Mysql不支持)

    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

    select t.*,u.* from test t full join user u on t.location_id=u.id

    结果:

    创作不易,如果本篇文章能帮助到你,请给予支持,赠人玫瑰,手有余香,虫虫蟹蟹观众姥爷了

    展开全文
  • 所有关联表查询方式

    多人点赞 2020-07-13 21:22:16
    虫虫:为了方便小白 虫虫把关联表的查询方式总结了 关联查询种类 等值连接、自然连接、内连接、自连接、左外连接、右外连接、全连接 实验用表 本次用到的表有test表和user表,下面是两个表的sql代码 SET NAMES utf8...

    前言

    想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是

    虫虫:为了方便小白 虫虫把关联表的查询方式总结了

    image

    关联查询种类

    等值连接、自然连接、内连接、自连接、左外连接右外连接、全连接

    实验用表

    本次用到的表有test表和user表,下面是两个表的sql代码

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for test
    -- ----------------------------
    DROP TABLE IF EXISTS `test`;
    CREATE TABLE `test`  (
      `location_id` int(11) DEFAULT NULL,
      `location_name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      INDEX `name_index`(`location_name`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of test
    -- ----------------------------
    INSERT INTO `test` VALUES (1, 'UK');
    INSERT INTO `test` VALUES (2, 'US');
    INSERT INTO `test` VALUES (3, 'Chain');
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` int(11) NOT NULL,
      `username` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `birthday` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `sex` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `location_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES (1, 'Tom', '1', 'boy', 'UK');
    INSERT INTO `user` VALUES (2, 'Bob', '2', 'boy', 'US');
    INSERT INTO `user` VALUES (4, 'Worm', '4', 'boy', 'Chain');
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    

    等值连接

    使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列

    select * from test t,user u where t.location_id=u.id
    

    结果:

    location_id location_name id username birthday sex location_name(1)
    1 UK 1 Tom 1 boy UK
    2 US 2 Bob 2 boy US

    自然连接

    进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。

    1.等值连接中不要求属性值完全相同,而自然连接要求两个关系中进行比较的必须是相同的属性组(属性名可以不同),即要求必须有相同的值域。

    2.等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

    select * from test t natural join user u 
    

    结果:

    location_id location_name id username birthday sex
    UK 1 1 Tom 1 boy
    US 2 2 Bob 2 boy
    Chain 3 4 Worm 4 boy

    内连接

    内连接与等值连接是同一件事,只是内连接是由SQL 1999规则定的书写方式。两个说的是一码事。

    select * from test t join user u on t.location_id=u.id 
    

    你可以可以加上inner

    select * from test t inner join user u on t.location_id=u.id
    

    结果:

    location_id location_name id username birthday sex location_name(1)
    1 UK 1 Tom 1 boy UK
    2 US 2 Bob 2 boy US

    自连接

    自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

    select * from user t  join user u on t.sex=u.sex
    

    结果:

    id username birthday sex location_name id(1) username(1) birthday(1) sex(1) location_name(1)
    1 Tom 1 boy UK 1 Tom 1 boy UK
    2 Bob 2 boy US 1 Tom 1 boy UK
    4 Worm 4 boy Chain 1 Tom 1 boy UK
    1 Tom 1 boy UK 2 Bob 2 boy US
    2 Bob 2 boy US 2 Bob 2 boy US
    4 Worm 4 boy Chain 2 Bob 2 boy US
    1 Tom 1 boy UK 4 Worm 4 boy Chain
    2 Bob 2 boy US 4 Worm 4 boy Chain
    4 Worm 4 boy Chain 4 Worm 4 boy Chain

    左外连接

    左向外联接的结果集包括 left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

    select * from test t  left join user u on t.location_id=u.id
    

    结果:

    location_id location_name id username birthday sex location_name(1)
    1 UK 1 Tom 1 boy UK
    2 US 2 Bob 2 boy US
    3 Chain

    右外连接

    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    select t.*,u.* from test t  right join user u on t.location_id=u.id
    

    结果:

    location_id location_name id username birthday sex location_name(1)
    1 UK 1 Tom 1 boy UK
    2 US 2 Bob 2 boy US
    4 Worm 4 boy Chain

    全连接(Mysql不支持)

    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

    select t.*,u.* from test t  full join user u on t.location_id=u.id
    

    结果:

    location_id location_name id username birthday sex location_name(1)
    1 UK 1 Tom 1 boy UK
    2 US 2 Bob 2 boy US
    3 Chain
    4 Worm 4 boy Chain

    image

    创作不易,如果本篇文章能帮助到你,请给予支持,赠人玫瑰,手有余香,虫虫蟹蟹观众姥爷了

    展开全文
  • 前言想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是虫虫:为了方便小白 虫虫把关联表的查询方式总结了关联查询种类等值连接、...

    28a2e886b40d9957d61e7bf7f68089ac.png

    前言

    想象场景:小白初入职场,看到很多数据库的代码发现都不清楚,急哭小白了,急急忙忙的去百度,收集到的资料很多,也很迷,乱七八糟的都是

    虫虫:为了方便小白 虫虫把关联表的查询方式总结了

    c390623b03b54e0c7b153ebcda799cf4.png

    关联查询种类

    等值连接、自然连接、内连接、自连接、左外连接右外连接、全连接

    实验用表

    本次用到的表有test表和user表,下面是两个表的sql代码

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for test
    -- ----------------------------
    DROP TABLE IF EXISTS `test`;
    CREATE TABLE `test`  (
      `location_id` int(11) DEFAULT NULL,
      `location_name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      INDEX `name_index`(`location_name`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of test
    -- ----------------------------
    INSERT INTO `test` VALUES (1, 'UK');
    INSERT INTO `test` VALUES (2, 'US');
    INSERT INTO `test` VALUES (3, 'Chain');
    
    SET FOREIGN_KEY_CHECKS = 1;
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` int(11) NOT NULL,
      `username` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `birthday` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `sex` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL,
      `location_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES (1, 'Tom', '1', 'boy', 'UK');
    INSERT INTO `user` VALUES (2, 'Bob', '2', 'boy', 'US');
    INSERT INTO `user` VALUES (4, 'Worm', '4', 'boy', 'Chain');
    
    SET FOREIGN_KEY_CHECKS = 1;

    等值连接

    使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列

    select * from test t,user u where t.location_id=u.id

    结果:

    e05f7286a37757f185e11854c7d2710c.png

    自然连接

    进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。

    1.等值连接中不要求属性值完全相同,而自然连接要求两个关系中进行比较的必须是相同的属性组(属性名可以不同),即要求必须有相同的值域。

    2.等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

    select * from test t natural join user u

    结果:

    1ae9a6b0fa1052a9122e7dc373720dc7.png

    内连接

    内连接与等值连接是同一件事,只是内连接是由SQL 1999规则定的书写方式。两个说的是一码事。

    select * from test t join user u on t.location_id=u.id

    你可以可以加上inner

    select * from test t inner join user u on t.location_id=u.id

    结果:

    6c9851b3442024f0c0932f6b884da634.png

    自连接

    自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

    select * from user t  join user u on t.sex=u.sex

    结果:

    2da01459c714e1db47b6c41cb00c3c1c.png

    左外连接

    左向外联接的结果集包括 left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

    select * from test t  left join user u on t.location_id=u.id

    结果:

    85faaccf853ec9bff51cba645630d91e.png

    右外连接

    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    select t.*,u.* from test t  right join user u on t.location_id=u.id

    结果:

    9c7143aac0f76431b3d7680e9380f042.png

    全连接(Mysql不支持)

    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

    select t.*,u.* from test t  full join user u on t.location_id=u.id

    结果:

    5526794ecbdeb96d48e42716e1de1602.png

    c89b6ff06108af6e9c19ce34a8500e09.gif
    创作不易,如果本篇文章能帮助到你,请给予支持,赠人玫瑰,手有余香,虫虫蟹蟹观众姥爷了
    展开全文
  • Hibernate关联映射

    2019-09-27 15:58:41
    关系:事物之间相互作用、相互联系的状态。范围最大。 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。 关联:表示对象之间的关系,既有数量性,又有方向性;...关联的联系种类 在不考虑关联的方...

    关系:事物之间相互作用、相互联系的状态。范围最大。

    联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

    关联:表示对象之间的关系,既有数量性,又有方向性;动词:将对象之间通过某种方式联系起来。

    映射:这里指java对象和数据库表的一种对应关系。动词:形成这种对应关系。

    级联:有关系的双方中操作一方,另一方也将采取一些动作。

    关联的联系种类

    在不考虑关联的方向前提下,联系就是关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

    一对一联系(1:1):如用户和身份证、一夫一妻

    一对多联系(1:n):如班级和学生

    多对多联系(m:n):如学生和选课

    关联的方向:关联关系的方向可分为单向关联和双向关联。

    双向关联的方向其实就不重要了,因为通过任一一方都可以维护彼此的关系。也就是说:在双向关联中一对多和多对一都是一样的。

    单向关联

    在关联标记例如<many-to-one>或者<one-to-many>,方向都是从左到右,换句话说是由左边维护它们的关系,参见下面例子。

    假设存在两张表person表和address表,它们之间的联系是n:1;

    即一个人的居住地址是唯一的,一个地址却可以多个人居住。

    如果在应用的业务逻辑中,仅需要每个person实例能够查询得到其对应的Address实例,而Address实例并不需要查询得到其对应的person实例。

    <class name="Person" table="person">
    
        <id name="id" >
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            not-null="true"/>
    
    </class>
    
    <class name="Address" >
    
        <id name="id" column="addressId">
    
            <generator class="native"/>
    
        </id>
    
    </class>

     

    说明:这是一个多对一的单向关联:由多的一方来维护它们的关系,需要在name="Person"的class元素内加入关联标记,<many-to-one>。这种关联非常多。

    假设存在两张表person表和tel表,它们之间的联系是1:n;

    即一个人的联系电话可能有多个,一个电话只能对应一个人。

    如果在应用的业务逻辑中,我们仅仅关心每个person实例能够查询到其对应的所有tel实例,而tel实例并不需要查询得到其对应的person实例。

    <class name="Person">
    
        <id name="id" column="personId">
    
            <generator class="native"/>
    
        </id>
    
        <set name="tels">
    
            <key column="personId" not-null="true" />
    
            <one-to-many class="Tel"/>
    
        </set>
    
    </class>
    
    <class name="Tel">
    
        <id name="id" column="telId">
    
            <generator class="native"/>
    
        </id>
    
    </class>

     

    说明:这是一个一对多的单向关联:由一的一方来维护他们的关系,需要在name="Person"的class元素内加入关联标记,<one-to-many>。这种关联相对要少一些。大部分情况下我们都是操作多的一方的实例。

    双向关联

    在两边同时配置单向关联,就构成了双向管理。实际开发过程中,很多时候都是需要双向关联的,它在解决单向一对多维护关系的过程中存在的缺陷起了一定的修补作用。

    假设存在两张表person表和address表,它们之间的联系是n:1;

    即一个人的居住地址是唯一的,一个地址却可以多个人居住。

    既需要每个person实例能够查询得到其对应的Address实例,Address实例也需要查询得到其对应的person实例。

    <class name="Person">
    
        <id name="id" column="personId">
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            not-null="true"/>
    
    </class>
    
    <class name="Address">
    
        <id name="id" column="addressId">
    
            <generator class="native"/>
    
        </id>
    
        <set name="people" inverse="true">
    
            <key column="addressId"/>
    
            <one-to-many class="Person"/>
    
        </set>
    
    </class>

     

    说明:这是一个多对一双向关联。由双方维护彼此的关系。需要在name="Person"的class元素内加入关联标记,<many-to-one>。同时在name="Address"的class元素内加入集合映射<set>,并在其中加入关联标记:<one-to-many>。

    关联标记

    在hbm.xml中,关联标记<one-to-one>、<many-to-one>、<one-to-many>、<many-to-many>,关联的方向都是是从左到右。

    关联标记属性

    简单介绍下面几个,除了name是必须,其余都是可选的。更多的我们参考官文档。

    name="对应本类的属性名"

    column="映射到本表的字段名"

    class="映射到本表的实体类"

    unique="ture|false":(数据库外键字段生成一个唯一约束)

    not-null="ture|false"默认false(数据库外键字段是否允许为空值)

    lazy="ture|false"默认proxy(延迟加载)

    cascade(级联)属性

    级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作

    总共可以取值为:all、none、save-update、delete

    all-代表在所有的情况下都执行级联操作

    none-在所有情况下都不执行级联操作

    save-update-在保存和更新的时候执行级联操作

    delete-在删除的时候执行级联操作

    集合映射标记<set>

    <set name="peoples" inverse="true">

        <key column="addressId"/>

        <one-to-many class="Person"/>

    </set>

    <set name="peoples" inverse="true">name为持久化对象的集合的属性名称。

    <key column="classid" > column外键的名称

    <one-to-many class=“cn.edu.bzu.hibernate.Student" /> class持久化类

    inverse属性

    控制反转,主要用在一对多,多对对双向关联上,inverse可以设置到<set>集合上, 默认inverse为false。为true表示反转,由对方负责;反之,不反转,自己负责;如果不设,one和many两方都要负责控制,因此,会引发重复的sql语句以及重复添加数据。

    谁是多谁是一

    我们说一对一,多对一,多对多是谁对谁呢?在映射文件(.hbm.xml)中class元素中的对象关联标记中,比如<many-to-one>

    那么class元素的属性name就是many,<many-to-one>标记中 name就是one。同时column="addressId"指明了person表的外键。

    <class name="Person" table="person">
    
        <id name="id" >
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            not-null="true"/>
    
    </class>

     

    上面例子中Person就是many,address就是one。

    可以这么理解<many-to-one>在谁里面,谁就是many,<many-to-one>的属性name就是one。

    单向关联hbm.xml配置,单向关联常用的是多对一,单向 many-to-one 关联是最常见的单向关联关系。这种关联是数据库关系模式中的多对一:

    这个表的一个外键引用目标表的主键字段。

    下面例子中的person与address联系(数据库用语)为n:1,可以这么理解:

    即一个人的居住地址是唯一的,一个地址却可以多个人居住。

    <class name="Person" table="person">
    
        <id name="id" >
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            not-null="true"/>
    
    </class>
    
    <class name="Address" >
    
        <id name="id" column="addressId">
    
            <generator class="native"/>
    
        </id>
    
    </class>

     

    注意:<many-to-one>标签中column="addressId",为person表添加一个外键addressId。

    sql输出:

    create table Person ( personId bigint not null primary key, addressId bigint not null )

    create table Address ( addressId bigint not null primary key )

    双向关联hbm.xml配置

    1、一对多/多对一

    双向多对一关联 是最常见的关联关系。下面的例子解释了这种标准的父/子关联关系。

    下面例子中的person与address联系(数据库用语)为n:1,可以这么理解:

    即一个人的居住地址是唯一的,一个地址却可以多个人居住。

    <class name="Person">
    
        <id name="id" column="personId">
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            not-null="true"/>
    
    </class>
    
    <class name="Address">
    
        <id name="id" column="addressId">
    
            <generator class="native"/>
    
        </id>
    
        <set name="people" inverse="true">
    
            <key column="addressId"/>
    
            <one-to-many class="Person"/>
    
        </set>
    
    </class>

     

    注意:many-to-one关联需要将one的一端加入inverse="true";column="addressId"指明了person表的外键。

    sql输出:

    create table Person ( personId bigint not null primary key, addressId bigint not null )

    create table Address ( addressId bigint not null primary key )

    2、一对一

    基于外键关联的双向一对一关联也很常见。

    下面例子中person与address的联系(数据库用语)是1:1,可以这么理解:

    即一个人只能管理一个地方,一个地方只能由一个人管理。

    column="addressId"指明了person表的外键。

    <class name="Person">
    
        <id name="id" column="personId">
    
            <generator class="native"/>
    
        </id>
    
        <many-to-one name="address"
    
            column="addressId"
    
            unique="true"
    
            not-null="true"/>
    
    </class>
    
    <class name="Address">
    
        <id name="id" column="addressId">
    
            <generator class="native"/>
    
        </id>
    
        <one-to-one name="person"
    
            property-ref="address"/>
    
    </class>

     

    sql输出:

    create table Person ( personId bigint not null primary key, addressId bigint not null unique )

    create table Address ( addressId bigint not null primary key )

    3、使用连接表的关联

    使用连接表的关联通常针对多对多。连接表会是数据中另外建的一张表,来存储两个实体的联系。

    这张表有三个字段:本身的id,两个外键分别关联到两个实体的主键。

    下面是student与course的联系(数据库用语)是m:n,可以这么理解:

    一个学生可以选多门课程,一门课程也有多个学生。

    <class name="Student">
    
        <id name="id" column="studentId">
    
            <generator class="native"/>
    
        </id>
    
        <set name="courses" table="StudentCourse">
    
            <key column="studentId"/>
    
            <many-to-many column="courseId"
    
            class="Course"/>
    
        </set>
    
    </class>
    
    <class name="Course">
    
        <id name="id" column="courseId">
    
            <generator class="native"/>
    
        </id>
    
        <set name="students" inverse="true" table="StudentCourse">
    
            <key column="courseId"/>
    
            <many-to-many column="studentId"
    
            class="Student"/>
    
        </set>
    
    </class>

     

    注意:<set>增加了table属性,因此会另外建表。

    sql输出:

    create table Student ( studentId bigint not null primary key )

    create table StudentCourse ( studentId bigint not null, courseId bigint not null, primary key

    (studentId, courseId) )

    create table Course ( courseId bigint not null primary key )

    转载于:https://www.cnblogs.com/yjxFive/p/9138047.html

    展开全文
  • 关联式容器

    2017-05-27 23:10:03
    关联式容器主要差别在于元素的种类以及处理重复元素时的方式。优势是快速查出某特定value的值,具备对数复杂度,劣势是不能直接改变value的值,那会破坏元素的自动排序。Set元素依据其value自动排序,每个元素出现一...
  • 词汇解释 关系:事物之间相互作用、相互联系的状态。范围最大。 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。 关联:表示对象之间的关系,既有数量性,又有... 关联的联系种类 在不考虑关联的方向...
  • 词汇解释 关系:事物之间相互作用、相互联系的状态。范围最大。 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。 关联:表示对象之间的关系,既有数量性,又有...关联的联系种类 在不考虑关联的...
  • 推荐系统将用户和物品关联起来的3种方式: 1. 利用用户喜欢得物品,推荐和这批物品相似得的物品; 2. 利用和用户具有相似兴趣的用户群体,推荐这个群体喜欢的物品; 3. 用特征做桥梁关联用户和物品(用户有哪些...
  • GoF设计模式1.设计模式的七大原则2.类与类之间的关系3....根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。 创建型模式:用于描述“怎样创建对象”,它的
  • 在 Java 程序中,对于数据的输入、输出操作以流(stream)的方式进行,Java 提供了种类丰富的“流”类,java.io 包中重要的类有5个:File、InputStream、OutputStream、Reader、Writer。 Java IO 操作主要指的是使用...
  • 2,QScrollArea与QScrollBar,如果是要在widget中添加窗口滑动QScrollBar,可以直接用将widget放进QScrollArea中,并设置bar的显示方式为Qt::ScrollBarAsNeeded,有需要则显示,没有则不显示 3,一个信号关联槽条件...
  • 通过本章节的学习,大家可以认识ABB机器人常用的标准I/O板卡,学会信号的配置方法及监控与操作的方式,掌握Profibus总线配置方法和Profinet总线配置方法及学会系统输入输出和可编程按键的使用。智能方在线学院&...
  • QMimeData当然与MIME相关:MIME是描述消息内容类型的因特网标准,可以简单理解为对文件扩展名的详细解释,通过该解释,程序就可以知道应该以何种方式处理该数据。每个MIME类型由两部分组成,前面是数据的大类别,...
  • 运维中的MySQL数据库管理方式

    千次阅读 2019-02-27 01:05:19
    数据库种类大体分为:关系型数据库和非关系型数据库。 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对...
  • 内容导向其实与用户导向或需求导向是类似的概念,即在限定某些特定种类的内容时,在不更改或新增内容种类的前提下,如何创造出更大的价值。 内容的各种相关形式(如分发形式、参与形式、内容间的相互关联等)为主体...
  • Servlet

    2020-07-24 20:48:36
    Servlet服务器web服务软件Servlet含义扩展Web服务功能组件容器Tomcat和Eclipse关联删除关联好的Tomcat创建web工程Servlet响应流程浏览器发出请求的发方式请求方式种类常用的请求方式处理中文参数表单提交中中文...
  • UML类图

    2019-03-01 10:56:41
    UML类图类类图三种类实体类:控制类:边界类:类的UML图示组成类名:属性(Attributes):类的操作(Operations):类与类之间的关系关联关系双向关联单向关联关联多重性关联聚合关系组合关系:依赖关系实现方式泛化...
  • 这几种关联容器之间的区别在于元素的种类,以及处理副本的方式。排列的默认操作是"<",你也可以重载它。判断相等的方式是若两个元素之间都不小于对方,则认定相等。所有关联容器的实现方式都是基于同一种对二叉树...
  • UML-关系

    热门讨论 2018-05-27 18:02:09
    在UML中,事物之间相互联系的方式都被建模称为关系。在面向对象的建模中,有4种很重要的关系,关联,依赖,泛化,实现。在图形上,把关系画成一条线,并用不同的线区别关系的种类关联关系 关联(association)...
  • 在数据库中比较常见一对一、一对多的数据,本文将叙述如何用多种方式实现这些关联关系,并对这些方法进行比对和分析。  例子假设的场景如下:  有两张表:product(产品)、category(种类),一个产品只属于某...
  • 关系:事物之间相互作用、相互联系的状态。范围最大。 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。 关联:表示对象之间的关系,既有数量性,又有...关联的联系种类 在不考虑关联的方向前提下,...
  • 数据表可以彼此关联协作存储,也很容易提取数据。 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是...
  • 5月26号

    2019-09-26 04:48:44
     sort 种类方式。  relevance 关联,适当。  popular 流行的,通俗的。  newest 最新。  group id 组标识符。  artifact Id 工件id。  layout 布局,设计,安排  de...
  • 文章目录一 . 模式动机二 . 模式定义三 . 模式结构四 . 模式分析五 . 模式实例六 . 模式优缺点七 . 模式适用环境八 . 模式应用八 ....一 ....如果想要画带颜色的形状,比如想要...四种图像三种颜色,全关联要12种类 第二...
  • 点击上方 蓝字 关注我们创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝...
  • 图数据库JanusGraph与neo4j对比

    千次阅读 2019-06-10 17:34:18
    图数据库 文章目录什么是图?什么是图数据库?何时需要使用图数据库图数据库常用领域怎么确定需要使用图...​ 每一个节点代表一个实体,每一个关系代表两个节点的关联方式 什么是图数据库? ​ 图形数据库是N...
  • public class Main { public static void main(String[] args)... * 合成(Composition,也称组合)和聚合(Aggregation), 都是关联的特殊种类。 聚合表示一种弱的“拥有”关系,体现的是A对象可以包含 * B...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

关联方式种类