今天我们的任务是完成关于 Hibernate 主题的第二个项目。它的本质是了解数据库的结构,将实体映射到现有表,并添加最少的功能来检查映射是否正确完成。
现在更详细:
- 下载转储文件并将其部署到本地计算机。作为数据库,我们将使用一个测试数据库,该数据库作为示例随MySQL安装包一起分发。为了修复数据库的状态,需要转储,因为我们不能保证它不会在一天、一个月、一年内发生变化。
- 我们不会有项目模板,因此请自行创建项目。它应该是一个具有所有必需依赖项(hibernate-core-jakarta、mysql-connector-java、p6spy)的 Maven 项目。
- 在 Idea 中插入我们本地部署的数据库作为数据源。之后,在“数据库”选项卡中,将光标放在电影模式上并按下组合键
Alt+Ctrl+Shift+U
(仅适用于终极版)。这将显示整个电影模式的结构(包括列名、键等)。看起来像这样:我同意,看着不是很舒服。关闭所有栏目和评论的标题显示:
结果,您将获得一个可以分析的数据库模式:
- 电路看起来很复杂,但并非一切都那么糟糕。要分析数据库的结构,您需要找到从哪里开始。没有单一的正确答案,但我建议从表格开始
film
。我们以几个关系为例:film
表和之间的关系film_text
是显式一对一关系,因为表film_text
有一个film_id
字段不是指的是表中的IDfilm
(无外键)。但从名称和逻辑上看,这种联系应该是。另外,在表中,film_text
字段film_id
作为主键,保证了一个“电影”对应的“电影文本”不超过一个。- 现在让我们看看表
film
和category
。从逻辑上讲,一部电影可以有几个类别。一个类别,也许是不同的电影。此外,这两个表之间还有一个中间链接表film_category
。基于以上所有内容,这是一个显式的ManyToMany关系。 - 我们看表
film
和language
。从逻辑上看,电影可能有不同语言的翻译,不同的电影可能是同一种语言。也就是说,ManyToMany暗示自己。但是如果我们查看表格的内容film
,我们可以看到表格的每一行都是一部独特的电影。并且该行只有一个language_id字段(也有original_language_id,但是在所有记录中都是null,可以忽略)。也就是说,一部电影只能有一种语言。一种语言,也许是不同的电影。连接是ManyToOne(连接是从电影到语言)。
- 现在的主要任务是创建所有必要的实体类并将它们映射到模式表中
movie
。 - 添加一个方法,可以创建一个具有所有依赖字段的新客户(客户表)。不要忘记使该方法具有事务性(以免出现买家地址记录在数据库中但买家本人没有的情况)。
- 添加描述“客户去并归还以前租借的电影”事件的交易方法。选择您选择的任何买家和租赁活动。电影的评分不需要重新计算。
- 添加一个描述事件“买家去了商店(store)并在那里租用(rental)存货(inventory)”的交易方法。同时,他向卖家(工作人员)支付了一笔款项(付款)。电影(通过库存)自行选择。唯一的限制是影片必须可供出租。即要么rental中根本没有存货记录,要么填入该存货最后一次出租的表的return_date列。
rental
- 添加一个描述事件“一部新电影被拍摄并且可以出租”的交易方法。电影、语言、演员、类别等,随意选择。
- 无法更改表结构。但是你需要提出改进建议。我们在第 4 段中确定了一个有问题的地方(表字段上的表中缺少外键)。看看数据库结构中是否还有这样的“失误”。如果是这样,请将自述文件添加到项目的根目录并描述这些错误。
film_text
film_id
film
项目分析: