`
sdustyongz
  • 浏览: 89577 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate 多对一连接表单向关联

阅读更多
Hibernate 多对一连接表单向关联

一、模型介绍

多个人(Person)对应一个地址(Address)。

二、实体(省略getter、setter方法)

public class Personn1tab {
    private int personid;
    private String name;
    private int age;
    private Addressn1tab addressn1tab;

public class Addressn1tab {
    private int addressid;
    private String addressdetail;

三、表模型

mysql> desc address_n1tab;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| addressid     | int(11)      | NO   | PRI | NULL    | auto_increment |
| addressdetail | varchar(255) | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

mysql> desc join_n1tab;
+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| personid   | int(11) | NO   | PRI |         |       |
| addressn1tab | int(11) | YES  | MUL | NULL    |       |
+------------+---------+------+-----+---------+-------+

mysql> desc person_n1tab;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| personid | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255) | YES  |     | NULL    |                |
| age      | int(11)      | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

四、生成的SQL脚本

CREATE TABLE `address_n1tab` (
  `addressid` int(11) NOT NULL auto_increment,
  `addressdetail` varchar(255) default NULL,
  PRIMARY KEY  (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

CREATE TABLE `join_n1tab` (
  `personid` int(11) NOT NULL,
  `address11fk` int(11) default NULL,
  PRIMARY KEY  (`personid`),
  KEY `FKAC780AAADAE3A82C` (`personid`),
  KEY `FKAC780AAAC6242A64` (`address11fk`),
  CONSTRAINT `FKAC780AAAC6242A64` FOREIGN KEY (`address11fk`) REFERENCES `address_n1tab` (`addressid`),
  CONSTRAINT `FKAC780AAADAE3A82C` FOREIGN KEY (`personid`) REFERENCES `person_n1tab` (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

CREATE TABLE `person_n1tab` (
  `personid` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `age` int(11) default NULL,
  PRIMARY KEY  (`personid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;


五、映射方法

<hibernate-mapping>
    <class name="com.lavasoft.dx._n_1_tab.Personn1tab" table="PERSON_n1tab">
        <id name="personid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!--使用join元素显式确定链接表-->
        <join table="join_n1tab">
            <!--映射关联所用的外键-->
            <key column="personid"/>
            <many-to-one name="addressn1tab"/>
        </join>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.lavasoft.dx._n_1_tab.Addressn1tab" table="ADDRESS_n1tab">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="addressdetail"/>
    </class>
</hibernate-mapping>


六、测试方法

public class Test_n1tab {
    public static void main(String[] args){
        Personn1tab p1=new Personn1tab();
        Personn1tab p2=new Personn1tab();

        p1.setAge(21);
        p1.setName("p1");

        p2.setAge(23);
        p2.setName("p2");

        Addressn1tab add=new Addressn1tab();
        add.setAddressdetail("郑州市经三路");

        p1.setAddressn1tab(add);
        p2.setAddressn1tab(add);

        Session session=HibernateUtil.getCurrentSession();
        Transaction tx=session.beginTransaction();
        session.save(add);
        session.save(p1);
        session.save(p2);
        tx.commit();
        HibernateUtil.closeSession();
    }
}

七、测试结果

1) :正常保存. 推荐这么干!

        session.save(p1);
        session.save(p2);

Hibernate: insert into ADDRESS_n1tab (addressdetail) values (?)
Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)
Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)
Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)
Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)

2) :正常保存.
        session.save(p1);
        session.save(p2);
        session.save(add);

Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)
Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)
Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)
Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)



本文出自 “熔 岩” 博客,转载请与作者联系!
分享到:
评论

相关推荐

    Hibernate关联映射

    7. Hibernate 多对一连接表单向关联: 这种关联同样需要连接表,连接表中的外键分别引用多的一方和一的一方。配置上,需要创建连接表实体并使用 `many-to-one` 元素。 8. Hibernate 多对多单向关联: 多对多关联...

    Hibernate 一对一连接表单向关联

    本知识点将深入讲解Hibernate中的一对一(OneToOne)连接,特别是单向关联的实现。 在数据库设计中,一对一关联是指两个实体之间存在唯一对应的关系,例如一个人可能只有一个身份证,或者一个账户只有一个用户信息...

    hibernate实体关联关系映射

    本文旨在深入探讨Hibernate中的实体关联关系映射技术,主要包括一对一、一对多、多对多等不同类型的关联关系及其在实际开发中的应用技巧。通过本文的学习,开发者可以更好地理解和掌握Hibernate框架下的实体关联关系...

    hibernate中的关联关系

    以上介绍的是 Hibernate 中一对一关联关系的三种不同方式,包括一对一连接表单向关联、一对一主键单向关联和一对一外键单向关联。每种关联方式都有其特定的应用场景,选择合适的关联方式对于提高应用程序的性能和可...

    Hibernate关联关系映射目录

    在多对一连接表单向关联中,多个实体(子实体)与一个实体(父实体)相关联,这种关联通过第三个表(连接表或关联表)来实现。 **表结构示例**: - **Department表**: - `departmentid`: 主键 - `departmentName`...

    hibernate+struts一对多增删改查demo(学生对班级)

    在IT行业中,开发Web应用程序时,常常需要处理复杂的对象关系,比如一对一、一对多、多对多等。这里我们关注的是“一对多”关系的实现,以“hibernate+struts”框架为例,结合MySQL数据库,来创建一个学生对班级的增...

    43-Hibernate数据关联实现〖MVSN〗_Struts + DAO + Hibernate(6).rar

    这包括一对一、一对多、多对一和多对多四种关联类型。例如,一个用户可以有多个订单,这是一种一对多的关系;反之,每个订单对应一个用户,这是一种多对一的关系。实现数据关联通常通过配置XML映射文件或使用注解来...

    hibrenate xml 配置 映射

    #### 2.1.7 多对一连接表单向关联 与上述相同,但通过连接表进行关联。 #### 2.1.8 多对多单向关联 多个实体可以关联到多个其他实体,这通常涉及一个中间表。`&lt;many-to-many&gt;`标签用于此目的。 ```xml ``` ##...

    Hibernate、Spring和Struts工作原理及使用理由

    Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一级缓存**:内部缓存,每个Session有自己的缓存,生命周期与Session相同。 - **二级缓存**:可选的全局缓存,支持应用...

    Spring+Hibernate+Struts工作原理

    类之间的关系通过配置文件中的映射元素(如many-to-one、one-to-many、many-to-many)来定义,如一对一、一对多、多对多的关系映射。 Hibernate还提供了缓存机制,包括一级缓存(SessionFactory级别的缓存,每个...

    Hibernate工作原理及为什么要用

    3. **避免不必要的一对一关联**:多对一通常更为高效。 4. **对象缓存策略**:避免使用集合缓存,提高性能。 5. **集合类型选择**:Bag用于一对多,Set用于多对多,以确保无重复。 6. **显式多态**:在继承类中使用...

    简单Struts+Hibernate实例

    Struts是MVC(模型-视图-控制器)设计模式的一个实现,主要用于控制应用程序的流程,而Hibernate则是一个对象关系映射(ORM)工具,用于简化数据库操作。在这个"简单Struts+Hibernate实例"中,我们将深入探讨这两个...

    JavaEE struts2 Hibernate结合贴吧小案例

    在Struts2中,Action返回的结果通常会与一个JSP页面关联,通过Struts2标签库(如s:form、s:textfield等)来渲染表单和显示数据。 总的来说,这个小案例是一个很好的实战练习,涵盖了JavaEE开发中的重要组成部分,...

    购物车实例(struts+hibernate)

    【购物车实例(Struts+Hibernate)】是一个典型的Web应用开发案例,主要针对那些刚开始学习Struts和Hibernate框架的开发者。这个实例通过实现一个在线购物车的功能,帮助开发者理解这两个框架如何协同工作来构建实际...

    hibernate+struts2 框架项目源代码

    首先,Hibernate作为一款对象关系映射(ORM)框架,它消除了Java程序与数据库之间的直接交互,将数据库操作转化为对Java对象的操作。通过配置文件和注解,Hibernate可以自动管理数据库连接、SQL语句的生成以及对象的...

    一套Struts+hibernate的项目源码

    - **整合方式**:通常使用ActionForm对象接收表单数据,然后在Action中创建Hibernate Session,通过SessionFactory获取,执行数据操作后,将结果传递给视图层。 - **配置**:需要在struts-config.xml中配置Action...

    struts+spring+Hibernate

    3. 不使用一对一关联,用多对一代替。 4. 配置对象缓存,避免使用集合缓存。 5. 一对多集合使用 Bag,多对多集合使用 Set。 6. 继承类使用显式多态。 7. 表字段要少,通过表关联实现复杂查询,依赖于二级缓存。 ###...

    struts,spring,hibernate面试题

    - 用多对一替换一对一,减少数据库表的冗余。 - 配置对象缓存,避免集合缓存带来的性能问题。 - 使用Bag(无序集合)处理一对多,Set(唯一元素集合)处理多对多。 - 显式使用多态处理继承关系。 - 减少表字段数量,...

Global site tag (gtag.js) - Google Analytics