热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaforWeb学习笔记(一二七):映射关系(3)OneToOne

OneToOneEntityA和EntityB是一对一的关联关系。这在实际中较少使用到。如果某个Entity具有上百个属性,我们可能会将某些属性分别放入子entit

OneToOne

EntityA和EntityB是一对一的关联关系。这在实际中较少使用到。如果某个Entity具有上百个属性,我们可能会将某些属性分别放入子entity中另外存放。有点似列式数据库(如HBase)。用于属性很多,属性可以归类,很可能会有新增属性的情况。

小例子

CREATE TABLE Book (Id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,BookName VARCHAR(50) NOT NULL
) ENGINE = InnoDB;-- 下面注意,我们没有另外弄一流水号id做为主键,而直接就用外键Book_Id,有点似HBase中的row key。
-- one to one对应没有必要使用其他的主键。当然也可以提供,但要保证Book_Id至少是UNIQUE KEY,这才是一对一
CREATE TABLE Book_Price (Book_Id BIGINT UNSIGNED NOT NULL,Price FLOAT UNSIGNED NOT NULL,PRIMARY KEY (`Book_Id`),CONSTRAINT BOOK_BOOK_PRICE FOREIGN KEY (Book_Id) REFERENCES Book (Id) ON DELETE CASCADE
) ENGINE = InnoDB;

这里有几个特点:

  • Book中没有提供Book_Price的索引
  • 以此类推,我们可以提供Book_XXX表来扩展Book的属性。

单向索引

单向索引只是双向索引的热身,通过外键,获取相关信息。Book和普通的没有任何区别。重点看看BookPrice。

@Entity(name = "Book_Price")
public class BookPrice {private long id;private float price;private Book book;/* 我们仍提供了@Id,这样可以使用Spring Data中的CrudRepository接口 */@Id@Column(name = "Book_Id")public long getId() { ...}public void setId(long id) { ...}public float getPrice() { ... }public void setPrice(float price) { ... }/* 1)提供@OneToOne指出Entity之间的是一对一的关系。* fetch有两个值:* - EAGER :获取entity的时候就获取该属性* - LAZY:只有在访问该属性的时候采取获取该值。这个值在某些业务流程中并没被使用,以此减少数据库的操作。* 2)通过@JoinColumn指出外键所在的列名 */@OneToOne(fetch = FetchType.LAZY)@JoinColumn(name="Book_Id")public Book getBook() { ... }public void setBook(Book book) { ... }
}

双向索引

我们更希望的是在Book中获取BookPrice的信息,这就是双向索引。在双向所以中BookPrice的代码和单向索引一样,不再重复,重点看看Book。

@Entity
public class Book {private long id;private String bookName; private BookPrice bookPrice;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)public long getId() { ... }public void setId(long id) { ... }public String getBookName() { ... }public void setBookName(String bookName) { ... }/* 提供@OneToOne指出Entity之间的是一对一的关系:* mappedBy:指出OneToOne关系的另一头(BookPrice)中哪个属性和本entity对应,本例为BookPrice.book,填book* cascade:DETACH, MERGE,PERSIST, REFRESH, and REMOVE ,ALL表示全部。* orphanRemoval:如果为true,当设bookprice为null,则相关的在bookprice表格的内容也会删除。* optional : false表明对方必须存在,应为非null值。true为缺省值。* 但在测试中,optional = false:仍可将值设为null,联动删除bookPrice的相关行。 * */@OneToOne(mappedBy="book",fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)public BookPrice getBookPrice() { ... } public void setBookPrice(BookPrice bookPrice) { ... }
}

 

相关链接:我的Professional Java for Web Applications相关文章

 


推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
author-avatar
POPO炮炮_797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有