`

hibernate常用注解(2) ManyToOne OneToMany

 
阅读更多

ManyToOne 写在Many端 @(cascade(级联) = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH},fetch(提取方式:不写也会自动默认,To后面如果是one端:EAGER立即提取。To后面如果是Many端:LAZY延时提取) = FetchType.LAZY)

 

One端一定是被控端 Many端默认是主控端,也可以设置为被控端

 

例:

 

建表语句:

DROP TABLE IF EXISTS `t_company`;
CREATE TABLE `t_company` (
  `companyId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `companyName` varchar(30) NOT NULL,
  PRIMARY KEY (`companyId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gb2312;

INSERT INTO `t_company` VALUES ('1', 'Sun');
INSERT INTO `t_company` VALUES ('2', 'Apache');

 

DROP TABLE IF EXISTS `t_employee`;
CREATE TABLE `t_employee` (
  `employeeId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `employeeName` varchar(15) NOT NULL,
  `cid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`employeeId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=gb2312;

INSERT INTO `t_employee` VALUES ('1', 'Tom', '1');
INSERT INTO `t_employee` VALUES ('2', 'Summ', '1');
INSERT INTO `t_employee` VALUES ('3', 'Cat', '2');
INSERT INTO `t_employee` VALUES ('4', 'Vinylon', '1');
INSERT INTO `t_employee` VALUES ('5', 'Dog', '2');

 

Employee.java

 

package com.fancy.po;

import javax.persistence.CascadeType;
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.ManyToOne;
import javax.persistence.Table;
/**
 * -----------------------------------------
 * @描述: 实体类
 * -----------------------------------------
 */
/**
 * 下面只说@ManyToOne,如需了解其他注解,
 * 
 */
@Entity
@Table(name = "t_employee")
public class Employee {

    private Integer employeeId;
    private String  employeeName;
    private Company company;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getEmployeeId() {
        return employeeId;
    }
    public void setEmployeeId(Integer employeeId) {
        this.employeeId = employeeId;
    }
    public String getEmployeeName() {
        return employeeName;
    }
   
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

/** * @ManyToOne:多对一,cascade:级联,请参考上一篇 * fetch = FetchType.LAZY,延迟加载策略,如果不想延迟加载可以用FetchType.EAGER */ @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH},fetch = FetchType.LAZY) @JoinColumn(name = "cid") public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; }}

 


 

Company.java

package com.fancy.po;

import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
 * -----------------------------------------
 * @描述: 实体类
 * -----------------------------------------
 */
/**
 * 下面只说@OneToMany,如需了解其他注解,
 * 
 */
@Entity
@Table(name = "t_company")
public class Company {

    private Integer companyId;
    private String  companyName;
    private Set<Employee> employees;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getCompanyId() {
        return companyId;
    }
    public void setCompanyId(Integer companyId) {
        this.companyId = companyId;
    }
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

/** * @OneToMany 与 OneToOne相似的也用mappedBy,参考了Employee


     *控制这个One的是Employee声明的那个company对象  (private Company company;)
     * 可以参考上一篇
     */
    @OneToMany(mappedBy = "company")
    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }
}


其他例子

@ManyToOne(fetch=FetchType,cascade=CascadeType ) 可选 

@ManyToOne 表示一个多对一的映射 , 该注解标注的属性通常是数据库表的外键 

optional: 是否允许该字段为 null, 该属性应该根据数据库表的外键约束来确定 , 默认为 true 

fetch: 表示抓取策略 , 默认为 FetchType.EAGER 

cascade: 表示默认的级联操作策略 , 可以指定为 ALL,PERSIST,MERGE,REFRESH 和 REMOVE 中的若干组合 , 默认为无级联操作 

targetEntity: 表示该属性关联的实体类型 . 该属性通常不必指定 ,ORM 框架根据属性类型自动判断 targetEntity. 

 

@ManyToOne

示例 : 

    // 订单 Order 和用户 User 是一个 ManyToOne 的关系 

    // 在 Order 类中定义 

    @ManyToOne() 

    @JoinColumn(name="USER") 

    public User getUser() { 

       return user; 

    }

 

 

@JoinColumn 

可选 

@JoinColumn 和 @Column 类似 , 介量描述的不是一个简单字段 , 而一一个关联字段 , 例如 . 描述一个 @ManyToOne 的字段 . 

name: 该字段的名称 . 由于 @JoinColumn 描述的是一个关联字段 , 如 ManyToOne, 则默认的名称由其关联的实体决定 . 

例如 , 实体 Order 有一个 user 属性来关联实体 User, 则 Order 的 user 属性为一个外键 , 

其默认的名称为实体 User 的名称 + 下划线 + 实体 User 的主键名称 

示例 : 

    见 @ManyToOne 

 

@OneToMany(fetch=FetchType,cascade=CascadeType) 

可选 

@OneToMany 描述一个一对多的关联 , 该属性应该为集体类型 , 在数据库中并没有实际字段 . 

fetch: 表示抓取策略 , 默认为 FetchType.LAZY, 因为关联的多个对象通常不必从数据库预先读取到内存 

cascade: 表示级联操作策略 , 对于 OneToMany 类型的关联非常重要 , 通常该实体更新或删除时 , 其关联的实体也应当被更新或删除 

例如 : 实体 User 和 Order 是 OneToMany 的关系 , 则实体 User 被删除时 , 其关联的实体 Order 也应该被全部删除 

示例 : 

    @OneToMany(cascade=CascadeType.ALL)

    public List getOrders() { 

       return orders; 

    } 

 

@ManyToMany 

可选 

@ManyToMany 描述一个多对多的关联 . 多对多关联上是两个一对多关联 , 但是在 ManyToMany 描述中 , 中间表是由 ORM 框架自动处理 

targetEntity: 表示多对多关联的另一个实体类的全名 , 例如 :package.Book.class 

mappedBy: 表示多对多关联的另一个实体类的对应集合属性名称 

示例 : 

    User 实体表示用户 ,Book 实体表示书籍 , 为了描述用户收藏的书籍 , 可以在 User 和 Book 之间建立 ManyToMany 关联 

分享到:
评论

相关推荐

    hibernate常用注解

    #### 一、JPA与Hibernate注解基础 JPA(Java Persistence API)是一种标准规范,用于实现对象关系映射(ORM),允许开发人员使用注解或XML来描述实体对象与数据库表之间的映射关系。Hibernate是JPA的一种实现,它...

    Hibernate 3 注解技术讲解

    **Hibernate 3 注解技术详解** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。 Hibernate 3引入了注解支持,使得开发人员无需XML配置文件即可进行对象持久化,提高了...

    HIBERNATE 一对多 onetomany

    在Hibernate中,这种关系可以通过在实体类中定义`@OneToMany`注解来表示。 **配置实体类** 1. **父实体类**:在这个关系中,"一"端的实体称为父实体。例如,我们用`Student`作为父实体,它有一对多的课程关联。在`...

    spring mvc + spring + hibernate 全注解整合开发视频教程 04

    字段级别的注解如`@Column`、`@OneToMany`、`@ManyToOne`等用于映射数据库字段和关系。 整合这三个框架时,Spring会管理Hibernate SessionFactory,并通过`@Transactional`注解实现事务管理。这样,开发者可以专注...

    hibernate基础 注解开发 检索

    #### 一、Hibernate注解开发概述 **Hibernate**是一种流行的Java持久层框架,提供了对象关系映射(ORM)的功能,使得Java开发者能够更高效地进行数据库操作。注解作为Java SE 5引入的新特性之一,在Hibernate中被广泛...

    Hibernate注解 关联关系映射注解.docx

    在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)的一种方式。本篇文章将详细探讨在Hibernate中如何使用注解来处理各种关联关系,特别是`mappedBy`属性的用法。 首先,`@OneToMany`注解用于表示...

    hibernate+spring注解例子

    在`Hibernate`中,我们还可以使用注解来处理关联关系,如`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`,它们分别对应一对一、一对多、多对一和多对多的关系。例如,一个用户可以有多个订单,那么在订单...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    通过@Entity、@Table、@Id等注解,我们可以将Java类映射到数据库表,而@OneToMany、@ManyToOne等注解则用于处理关联关系。Hibernate的Session API提供了CRUD操作,并且支持复杂的查询语句,包括HQL(Hibernate Query...

    hibernate实体系注解

    **一、Hibernate注解基础** 在Hibernate 3.2之后,引入了注解支持,使得开发者不再需要XML配置文件来定义实体类和映射关系。主要的注解包括: 1. `@Entity`:标记一个Java类为Hibernate实体类,对应数据库中的表。...

    SSH2 annotation 实现struts2.1.6 spring2.5.6 hibernate3.3 全注解开发

    例如,Spring中的`@Autowired`注解可以自动装配依赖,`@Transactional`可以标记事务边界,而Hibernate的`@ManyToOne`、`@OneToMany`等注解则用来定义对象关系。 在实际开发中,这样的组合可以实现快速开发,同时...

    jpa/hibernate继承注解

    若希望实现懒加载,可以在继承关系中使用`@OneToMany`或`@ManyToOne`注解并设置`fetch = FetchType.LAZY`。 7. **性能考虑** 不同的继承策略对数据库性能和设计有不同影响。STI可能导致表膨胀,而TPC可能导致更多...

    Hibernate 注解映射

    * 双向一对多映射:在多端使用 @ManyToOne 和 @JoinColumn 注解,在一端使用 @OneToMany 和 mappedBy 注解,指定关联属性名。 * 双线一对一映射:基于外键使用 @OneToOne 注解,基于主键使用 Hibernate 的扩展注解。...

    Hibernate关于注解的一对多,多对多,一对一

    在Hibernate中,我们可以使用`@OneToMany`注解来表示这种关系。 1. **@OneToMany** 注解:这个注解用在父类(拥有多个子类的对象)的属性上,用于定义一对多关系。你可以指定`mappedBy`属性来指定子类中的反向关联...

    Hibernate 注解说明文档

    本文档将深入探讨Hibernate注解的使用,帮助开发者更好地理解和利用这些注解来实现对象关系映射(ORM)。 一、Hibernate注解基础 Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而...

    spring-hibernate注解配置源码

    本实例"spring-hibernate注解配置源码"旨在展示如何在不使用XML配置的情况下,通过注解的方式整合Struts2、Spring和Hibernate,创建一个完整的MVC(模型-视图-控制器)架构的应用。下面将详细介绍这个过程中的关键...

    hibernate 关系注解

    在Hibernate中,关系注解用于在实体类中定义不同类型的数据库关系,如一对一、一对多、多对多等。以下是关于Hibernate关系注解的详细说明: 1. **一对一外键关联映射(单向)** 使用`@OneToOne`注解实现一对一关系...

    hibernate4注解详尽参考

    2. 关联映射注解:用于描述实体之间的关系,比如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。 3. 主键和生成策略注解:如@Id注解标识实体的主键,@GeneratedValue...

    hibernate4全注解例子

    常见的注解包括@Entity(定义实体类)、@Table(指定表名)、@Id(主键)、@GeneratedValue(生成策略)、@Column(字段映射)、@OneToMany、@ManyToOne、@OneToOne和@ManyToMany(关联映射)等。 3. **环境设置**...

    hibernate的注解形式

    首先,让我们理解Hibernate注解的基本概念。注解是一种元数据,它允许我们向编译器或JVM提供有关代码的信息。在Hibernate中,注解用于定义实体类、属性、关联关系等,使得Hibernate能够自动处理这些对象与数据库表...

    spring,springMVC,Hibernate全注解案例

    此外,`@Column`定义字段与列的映射,`@OneToMany`、`@ManyToOne`等处理一对多、多对一的关系。CRUD操作可以通过`@Transactional`注解开启事务管理,配合Hibernate提供的`Session`接口进行。 在实际的项目中,...

Global site tag (gtag.js) - Google Analytics