`
Ydoing
  • 浏览: 106020 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate单向关联N-1

 
阅读更多

无连接表的N-1关联

多个Employee关联一个Department。

Employee实体(N端):

package com.ydoing.hibernate2;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "employee_inf")
public class Employee {
    @Id
    @Column(name = "employee_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    // N-1单向关联
    @ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "department_id", nullable = false)

    private Department department;  
    ....省略get和set方法...

Department实体(1端):

package com.ydoing.hibernate2;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "department_inf")
public class Department {
    @Id
    @Column(name = "department_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;  
    ....省略get和set方法...

测试:

package com.ydoing.hibernate2;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.BeforeClass;
import org.junit.Test;
public class Main {
    private static Session session;
    @BeforeClass
    public static void init() {
        Configuration conf = new Configuration();
        conf.configure();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties())
                .build();
        SessionFactory factory = conf.buildSessionFactory(serviceRegistry);
        session = factory.openSession();
    }
    @Test
    public void test() {
        Employee emp = new Employee();
        emp.setName("Jack");
        emp.setAge(20);
        emp.setDepartment(new Department("dev"));
        Transaction tx = session.getTransaction();
        tx.begin();
        session.save(emp);
        tx.commit();
        session.close();
    }
}

Console输出:

Hibernate: 
    insert 
    into
        department_inf
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        employee_inf
        (age, department_id, name) 
    values
        (?, ?, ?)

从以上输出不能看出,Hibernate先插入主表address_inf,然后再持久化从表employee_inf。并没有连接表生成。但是employee_inf多出来外键列department_id。

数据表:
这里写图片描述
这里写图片描述

有连接表的N-1关联

还是用以上的列子,修改Employee类:

package com.ydoing.hibernate2;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "employee_inf")
public class Employee {
    @Id
    @Column(name = "person_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    //N-1单向有连接表关联
    @ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL)
    // @JoinColumn(name = "department_id", nullable = false)
    @JoinTable(name = "employee_department", // 连接表名
    joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id", unique = true), inverseJoinColumns = @JoinColumn(name = "department_id", referencedColumnName = "department_id"))
    private Department department;  

    ....省略get和set方法...

Console输出:

Hibernate: 
    insert 
    into
        department_inf
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        employee_inf
        (age, name) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        employee_department
        (department_id, person_id) 
    values
        (?, ?)

从输出可以看出,Hiberate主动创建了employee_department表,并把employee_inf和department_inf两个表关联起来,还有这两个表都没有增加外键列。

数据表:
这里写图片描述
这里写图片描述
这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    HIbernate关联关系总结

    本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在这种关联关系中,一个实体(1端)可以与多个其他实体(N端)相关联。在Hibernate中,通常在1端的实体类中引入...

    23-Hibernate数据关联(11、M1、1N、MN)

    本教程将深入探讨Hibernate中的四种主要数据关联:一对一(11)、多对一(M1)、一对多(1N)和多对多(MN)的关系映射。 1. **一对一(11)关联**: 在现实世界中,有些实体间存在一对一的关系,例如一个人只有一...

    hibernate 全面学习->hibernate 关联映射学习

    `hibernate_many2many_1`和`hibernate_many2many_2`的示例可能会展示如何创建中间表来存储这种关系,通常需要定义两个`@ManyToMany`注解,分别在两个参与关联的实体上,并通过`@JoinTable`来指定关联的表结构。...

    hibernate多对多单向关联

    在本篇讨论中,我们将深入探讨Hibernate如何实现多对多单向关联。 一、多对多关联的配置 在Hibernate中,多对多关联通常通过`@ManyToMany`注解来定义。这个注解可以用在实体类的属性上,表示该属性与另一个实体类...

    hibernateORM1-n映射

    8. **单向与双向映射**:一对多关系可以是单向的,即只有“1”端知道“N”端;也可以是双向的,双方都有对对方的引用。双向映射需要注意维护关系的同步,防止数据不一致。 在实践中,我们可以使用Hibernate的API来...

    hibernate03:多对一单向关联、多对一双向关联

    本文主要探讨的是Hibernate中的两种关联关系:多对一单向关联和多对一双向关联。通过理解这两种关联方式,我们可以更好地设计和实现复杂的数据库模型。 首先,我们来看**多对一单向关联**。这种关联意味着一个实体...

    Hibernate笔记

    单向N-1关联 这种关联通常代表一种“一对多”的关系,例如,一个人可以有多个地址。在Hibernate中,我们可以通过在N的一端(通常是拥有集合的一方)使用`&lt;many-to-one&gt;`元素来实现这种关联。对于无连接表的N-1关联...

    Hibernate一对多单向关联映射

    本篇文章将深入探讨Hibernate中一对多单向关联映射的概念、配置以及其实现方法。 一、概念理解 一对多关联意味着在数据库中,一个表(实体)的一条记录可以对应另一个表(实体)的多条记录。例如,一个学生可以有多...

    Hibernate教程04_关系映射之一对一单向外键关联

    8. **查询优化**:使用HQL(Hibernate Query Language)或Criteria API进行更高效的查询,避免N+1查询问题。 通过学习这个教程和相关源码,开发者将能够理解和掌握在Hibernate中如何配置和使用一对一单向外键关联,...

    hibernate关联映射

    1. **单向N-1关联(无连接表)** 在这种关联中,一个Person对象拥有一个Address对象。在Person类中添加`private Address address`属性,并在`person.hbm.xml`中配置`&lt;many-to-one&gt;`元素,如`&lt;many-to-one name=...

    Hibernate性能调优

    - 解决著名的`n+1`问题,即多次查询相同数据的问题。 - 通过配置适当的缓存策略,可以减少数据库的直接访问次数。 #### 七、`inverse`与二级缓存的关系 在管理双向关联时,`inverse`属性和二级缓存的使用需要仔细...

    Hibernate中的关联映射

    ###### 2.1.1 多对一 (N-1) - **基于FK**:在这种情况下,只有一方包含了另一方的引用关联实体属性。例如,`Person`类包含了一个指向`Address`类的属性。 - **映射示例**: ```xml &lt;many-to-one name="address" ...

    Hibernate Annotation 基于外键的单向多对一关联

    在实际应用中,我们还需要注意一些最佳实践,比如合理选择加载策略(EAGER vs LAZY),避免N+1查询问题,以及正确处理级联操作(如级联保存、删除等)。通过理解并熟练运用这些技巧,可以更高效地使用Hibernate进行...

    Hibernate一对一关联映射(注解)

    1. **外键约束**:在一对一关联中,通常由一方持有外键,可以是双向关联,也可以是单向关联。 2. **唯一性**:在数据库中,一对一关联的两个表的关联字段必须具有唯一性约束。 3. **性能考虑**:根据业务需求选择...

    Hibernate学习

    - **一对多,在一的一端维护关系的缺点**:可能导致性能问题,如N+1查询问题。 - **一对多单向数据加载**:演示如何加载一对多的数据。 #### 一对多关联映射双向(one-to-many) - **学生映射文件修改后的**:调整...

    Hibernate入门到精通

    - 查询:HQL(Hibernate Query Language)是Hibernate的查询语言,可以避免N+1问题,通过一次性加载所有数据或使用`Criteria` API进行分页查询。 总的来说,Hibernate通过简化数据库操作,提高了开发效率。理解并...

    Hibernate的N对N的关系映射

    ### Hibernate的N对N的关系映射详解 #### 一、概念理解 在关系型数据库设计中,实体之间的关联关系主要有三种类型:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)。而Hibernate作为一种...

    Hibernate 一对一连接表单向关联

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

Global site tag (gtag.js) - Google Analytics