当前位置:首页 > 科技  > 软件

利用@Embeddable实现实体和级联关系的分开定义

来源: 责编: 时间:2024-02-01 12:45:55 267观看
导读@Embeddable注解一般和@Embedded搭配使用@Embeddable是Hibernate中的注解之一,它的作用是标识一个类是可以嵌入(Embeddable)到其他实体类中的类。使用@Embeddable注解的类通常表示了一组相关的属性,这些属性可以被嵌入到

@Embeddable注解

一般和@Embedded搭配使用d7B28资讯网——每日最新资讯28at.com

@Embeddable是Hibernate中的注解之一,它的作用是标识一个类是可以嵌入(Embeddable)到其他实体类中的类。使用@Embeddable注解的类通常表示了一组相关的属性,这些属性可以被嵌入到其他实体中,而不需要创建独立的数据库表。主要特点和作用包括d7B28资讯网——每日最新资讯28at.com

可嵌入性(Embeddable)

被@Embeddable注解标识的类可以被嵌入到其他实体类中,它的属性将会被合并到包含它的实体类的表中,而不是创建一个独立的表。d7B28资讯网——每日最新资讯28at.com

代码重用

可以通过@Embeddable注解,将一组相关的属性定义在一个独立的类中,然后在多个实体类中重用这个类,提高了代码的重用性和可维护性。下面是一个简单的示例,演示了@Embeddable的基本用法d7B28资讯网——每日最新资讯28at.com

@Embeddablepublic class Address {    private String street;    private String city;    private String zipCode;    // Constructors, getters, setters, etc.}@Entitypublic class Employee {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @Embedded    private Address address;    // Constructors, getters, setters, etc.}

在这个例子中,Address类被@Embeddable注解标识,表示它可以被嵌入到其他实体类中。Employee实体类使用了@Embedded注解,将Address类嵌入到自身,从而共享Address中的属性。在数据库中,Employee表将包含street、city、zipCode等Address类的属性。总的来说,@Embeddable注解是为了支持实体类的组合,允许将一组属性定义在一个独立的类中,以提高代码的模块化和可读性。d7B28资讯网——每日最新资讯28at.com

复合查询

在使用@Embedded注解后,HQL(Hibernate Query Language)中的复合查询可以通过使用嵌入对象的属性路径来实现。嵌入对象的属性路径形式为embeddedObject.property。以下是一个示例,演示如何在HQL中进行复合查询d7B28资讯网——每日最新资讯28at.com

假设有一个实体类Employee,其中包含一个嵌入对象Addressd7B28资讯网——每日最新资讯28at.com

@Entitypublic class Employee {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @Embedded    private Address address;    // Constructors, getters, setters, etc.}@Embeddablepublic class Address {    private String street;    private String city;    private String zipCode;    // Constructors, getters, setters, etc.}

如果我们想通过HQL查询Employee中特定地址的员工,可以使用以下查询d7B28资讯网——每日最新资讯28at.com

String hql = "FROM Employee e WHERE e.address.city = :city";List<Employee> employees = entityManager.createQuery(hql, Employee.class)        .setParameter("city", "SomeCity")        .getResultList();

在这个例子中,HQL查询中使用了嵌入对象的属性路径 e.address.city 来查询Employee中地址为特定城市的员工。注意事项d7B28资讯网——每日最新资讯28at.com

  1. 使用@Embedded注解时,嵌入对象的属性在HQL查询中需要使用属性路径。
  2. 在HQL中使用嵌入对象的属性路径时,需要使用实体类的别名(在这个例子中是e)。
  3. 请根据实际情况调整查询条件和属性路径,确保查询的准确性。

@Embeddable注解和@Embedded的实现原理

@Embeddable 和 @Embedded 是 Hibernate 中用于实体映射中的嵌入对象的注解。它们的实现原理涉及到 JPA(Java Persistence API)规范和 Hibernate 的实现。d7B28资讯网——每日最新资讯28at.com

@Embeddable 注解

  • 作用@Embeddable 注解用于标识一个类是可嵌入的,可以作为其他实体的一部分。
  • 实现原理 当一个类被标记为 @Embeddable 时,它告诉 Hibernate 这个类的实例可以被嵌入到其他实体中,不需要独立生成数据库表,而是被包含在包含它的实体的表中。

@Embedded 注解

  • 作用@Embedded 注解用于标识一个字段或属性是一个嵌入对象。
  • 实现原理 当一个字段或属性被标记为 @Embedded 时,它告诉 Hibernate 在数据库表中使用嵌入对象对应的列,而不是为该字段创建独立的表。这个注解通常与 @Embeddable 结合使用,将一个可嵌入的对象嵌入到另一个实体中。

实例

下面是一个简单的示例,演示了 @Embeddable 和 @Embedded 的用法d7B28资讯网——每日最新资讯28at.com

@Embeddablepublic class Address {    private String street;    private String city;    private String zipCode;    // Constructors, getters, setters, etc.}@Entitypublic class Employee {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @Embedded    private Address address;    // Constructors, getters, setters, etc.}

在这个例子中,Address 类被标记为 @Embeddable,表示它是一个可嵌入的类。Employee 实体中的 address 属性使用了 @Embedded 注解,将 Address 类嵌入到 Employee 实体中。这样,在数据库中 Employee 表会包含 street、city、zipCode 等属性的列,而不会单独生成一个 Address 表。实际的实现原理涉及到 JPA 提供商的具体实现,而 Hibernate 作为 JPA 的一个实现,会根据 JPA 规范来处理 @Embeddable 和 @Embedded 注解。在处理时,Hibernate 会动态生成适应于数据库的 SQL 语句,将嵌入对象的属性映射到包含它的实体的表中。d7B28资讯网——每日最新资讯28at.com

可嵌入实体的使用场景

给主实体增加字段

可嵌入实体常用于向主实体(包含嵌入实体的实体)增加一组字段,将这组字段抽象为一个独立的实体类。这样做有助于代码的模块化和重用。例如,假设有一个 Person 实体,可以使用嵌入实体 Address 来添加地址信息d7B28资讯网——每日最新资讯28at.com

@Embeddablepublic class Address {    private String street;    private String city;    private String zipCode;    // Constructors, getters, setters, etc.}@Entitypublic class Person {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @Embedded    private Address address;    // Constructors, getters, setters, etc.}

给主实体增加级联关系

可嵌入实体还可以用于给主实体增加级联关系。嵌入实体可以包含与其他实体的关联关系,从而使得主实体也拥有这些关联关系。例如,假设有一个 Company 实体,可以使用嵌入实体 ContactInfo 来添加联系信息,其中的 ContactInfo 包含了与 Employee 实体的一对多关系d7B28资讯网——每日最新资讯28at.com

@Embeddablepublic class ContactInfo {    @OneToMany(mappedBy = "company")    private List<Employee> employees;    // Constructors, getters, setters, etc.}@Entitypublic class Company {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String companyName;    @Embedded    private ContactInfo contactInfo;    // Constructors, getters, setters, etc.}@Entitypublic class Employee {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String employeeName;    @ManyToOne    private Company company;    // Constructors, getters, setters, etc.}

在这个例子中,Company 实体通过嵌入实体 ContactInfo 拥有了与 Employee 实体的一对多关系。总体而言,可嵌入实体的使用场景包括但不限于给主实体增加字段、给主实体增加级联关系,通过将一组相关的字段或关联关系抽象成可嵌入实体,提高了代码的模块化和可读性。d7B28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70396-0.html利用@Embeddable实现实体和级联关系的分开定义

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue3问题:如何实现页面引导提示?

下一篇: React 性能优化终章,成为顶尖高手的最后一步

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
Top