Skip to content

Commit

Permalink
Merge pull request #26 from qinkangdeid/feature/doc-update
Browse files Browse the repository at this point in the history
docs(feature/doc-update): errata document
  • Loading branch information
babyfish-ct authored Apr 18, 2024
2 parents f92c85b + ca342d2 commit 8c8c065
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ interface BookStore {
- `authors`: 多对多关联

> 参与编写改书的所有作者
> 参与编写该书的所有作者
</td>
<td>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ interface TreeNode {
</Tabs>

:::info
这里`TreeNode.name``TreeNode.parent`属性被`@Key`修饰。这个两个属性对应于数据库中`BOOK`表的普通字段`NAME`和外键字段`PARENT_ID`
这里`TreeNode.name``TreeNode.parent`属性被`@Key`修饰。这两个属性对应于数据库中`BOOK`表的普通字段`NAME`和外键字段`PARENT_ID`

这表示,如果`TreeNode.id`属性没有被指定 *(任何被指定了自动分配策略的`id`属性都可以缺失)*,那么,默认情况下,Jimmer将基于`NAME``PARENT_ID`字段查询数据库中是否存在已有数据,最终决定应该执行插入操作还是更新操作。
:::
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Jimmer高度依赖于JVM生态的预编译技术:

- 先用命令行在要打开的项目目录下执行`./mvnw install`*(仅Java例子提供)*`./gradlew build`命令完成代码生成,再用Intellij打开项目。

- 直接用Intelilj代开项目,暂时无视IDE的错误,依赖下载完毕后,直接运行项目的main方法或单元测试 *(save-command/save-command-kt以单元测试演示功能)*,所有IDE错误将会自动消失,应用也会被正确启动。
- 直接用Intellij打开项目,暂时无视IDE的错误,依赖下载完毕后,直接运行项目的main方法或单元测试 *(save-command/save-command-kt以单元测试演示功能)*,所有IDE错误将会自动消失,应用也会被正确启动。
:::

## 如何使用
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Jimmer是一个Java/Kotlin双语框架
:::info
就JVM生态而言,POJO是导致这个问题的根本原因。

POJO*(也可以叫结构体)*缺乏必要的灵活性和表达力,却被几乎被所有的JVM框架作为数据模型和核心,严重限制了JVM生态的技术创新。
POJO*(也可以叫结构体)*缺乏必要的灵活性和表达力,却几乎被所有的JVM框架作为数据模型和核心,严重限制了JVM生态的技术创新。
:::

因此,在Jimmer中,ORM实体对象并非POJO。而是另外一种独特的万能数据对象*(后文会介绍)*,这种独特的实体对象撑起了Jimmer所有上层重大的变革,是整个框架的基石。
Expand All @@ -82,7 +82,7 @@ POJO*(也可以叫结构体)*缺乏必要的灵活性和表达力,却被几乎

## 3. 完整的功能

在本开开头我们提到了,革命性的ORM只是Jimmer的一部分,Jimmer实际的能力范围早已超越了一个ORM。
在本文开头我们提到了,革命性的ORM只是Jimmer的一部分,Jimmer实际的能力范围早已超越了一个ORM。

现在,我们给出Jimmer的功能示意图,并逐个讲解

Expand Down Expand Up @@ -141,7 +141,7 @@ Jimmer实体支持两个重要特征,动态性和不可变性

- 不可变性

Jimmer对象是不可变对象。不可变对象的好处的多方面的,相关文章和论述非常多,本文不做重复性讨论。
Jimmer对象是不可变对象。不可变对象的好处是多方面的,相关文章和论述非常多,本文不做重复性讨论。

:::tip
Jimmer选择不可变对象是为了让数据结构绝不包含[循环引用](https://en.wikipedia.org/wiki/Circular_reference)
Expand All @@ -159,7 +159,7 @@ Jimmer实体支持两个重要特征,动态性和不可变性

1. 基于现有不可变数据结构开启一个临时作用域。

2. 在这个作用域内,开发人人员可得到一个draft数据结构,该数据结构的形状和初始值和原数据结构完全一致,且可以被随意修改,包括修改任意深的子对象。
2. 在这个作用域内,开发人员可得到一个draft数据结构,该数据结构的形状和初始值和原数据结构完全一致,且可以被随意修改,包括修改任意深的子对象。

3. 作用域结束后,draft数据结构会利用收集到的修改行为创建另外一个新的数据结构。其中,未被修改的局部会被优化处理,复用以前的旧对象。

Expand All @@ -175,11 +175,11 @@ Jimmer对象允许某些属性缺失,对象缺少某个属性 *(其值未知)*

1. 对于Jackson序列化而言,缺失的属性会被自动忽略,就如同我们之前展示的那样。

如果服务端自己并不使用查询得到实体对象,而是直接写入到Http Response中。对于这种情况,无需DTO,直接使用实体对象很方便。
如果服务端自己并不使用查询得到的实体对象,而是直接写入到Http Response中。对于这种情况,无需DTO,直接使用实体对象很方便。

2. 如果直接用Java/Kotlin代码访问不存在的属性,会导致异常。<ViewMore buttonText="查看快捷示范"><Unloaded/></ViewMore>

如果服务端自己要使用查询得到实体对象,这会带来风险,尽管Jimmer实体在其他方面依旧保留了静态语言的特色,比如拼写安全、类型安全、甚至空安全*(如果使用kotlin)*
如果服务端自己要使用查询得到的实体对象,这会带来风险,尽管Jimmer实体在其他方面依旧保留了静态语言的特色,比如拼写安全、类型安全、甚至空安全*(如果使用kotlin)*

> 以JPA为例,从Hibernate3开始,lazy配置不再局限于关联属性,而是可以用于标量属性。后来演化为JPA之`@Basic`注解的`fetch`参数,
> 请参考这[这里](https://docs.oracle.com/javaee%2F7%2Fapi%2F%2F/javax/persistence/Basic.html)
Expand All @@ -192,20 +192,20 @@ Jimmer对象允许某些属性缺失,对象缺少某个属性 *(其值未知)*
- 要么显式地映射属性*(例如纯手工映射和转化)*,这种做法工作量巨大,枯燥且容易出错。
- 要么隐式地映射属性*(例如采用[BeanUilts](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html)技术)*,这种做法会引入新的不安全问题,即,无法在编译发现的问题。

即使你使用强大的[mapstruct](https://mapstruct.org/)你所能做也只是在这两个极端之间作出选择而已
即使你使用强大的[mapstruct](https://mapstruct.org/)你所能做的也只是在这两个极端之间作出选择而已

因此,Jimmer提供了DTO语言,用户使用该语言编写非常简单的代码,编译项目即可自动生成各种丰富的DTO类型定义。

:::tip
DTO语言的设计目的,在于

- 让生成DTO类型的的过程足够简单,从而让DTO类型足够廉价。
- 让生成DTO类型的过程足够简单,从而让DTO类型足够廉价。

- 100%符合静态语言安全性,在编译时发现所有问题并报错。
:::

在任何子项目中 *(并不限制为实体定义子项目)*,开发人员都可以在`src/main/dto`目录下随意建立扩展名为`dto`的文件,
廉价地方自动生成各种DTO类型。<ViewMore buttonText="查看快捷示范" title="DTO语言展示"><DTO/></ViewMore>
廉价的自动生成各种DTO类型。<ViewMore buttonText="查看快捷示范" title="DTO语言展示"><DTO/></ViewMore>

这种以极低成本快速生成的DTO类型可以和Jimmer实体对象彼此转换;因此,任何两种DTO类型都可以以Jimmer实体为中间媒介彼此转换。

Expand All @@ -225,7 +225,7 @@ Jimmer为查询任意形状的数据结构而设计,能像[GraphQL](https://gr

1. 查询残缺对象

所谓残缺对象,就是指指查询对象的部分属性,其信息量还不如一个孤单对象丰富
所谓残缺对象,就是指查询对象的部分属性,其信息量还不如一个孤单对象丰富
。<ViewMore buttonText="查看快捷示范" title="查询残缺对象" maxWidth="xl"><FetchPartial/></ViewMore>

2. 附带关联对象
Expand Down Expand Up @@ -304,7 +304,7 @@ Save Command,是Jimmer三个最基础的核心功能之一 *(另外两个是Fe

1. 保存孤单对象

这时最简单的情况,因为孤单的不存在任何关联数据。<ViewMore buttonText="查看快捷示范" title="保存孤单对象"><SaveAlone/></ViewMore>
这是最简单的情况,因为孤单的对象不存在任何关联数据。<ViewMore buttonText="查看快捷示范" title="保存孤单对象"><SaveAlone/></ViewMore>

2. 保存短关联

Expand Down Expand Up @@ -452,7 +452,7 @@ Jimmer支持两种各不同类型的触发器: BinLog触发器和Transaction触

### 3.6. Cache

Jimmer的缓存功能非常强大,具备一下3个特点
Jimmer的缓存功能非常强大,具备以下3个特点:

- 支持多级缓存,且每一级的缓存都允许用户选择自己喜欢的技术。

Expand Down Expand Up @@ -544,7 +544,7 @@ Remote Associations只是在有限时间内为微服务体系开发的首个功

- 实体模型生成工具

以下工具关注于根据数据库生成实体模型
以下工具专注于根据数据库生成实体模型

|项目类型|语言支持|项目地址|
|---|---|---|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Jimmer可以查询任意形状的数据结构,对被查询数据结构的控
### 1. 查询残缺对象

:::info
所谓残缺对象,就是指指查询对象的部分属性,其信息量还不如一个孤单对象丰富。
所谓残缺对象,就是指查询对象的部分属性,其信息量还不如一个孤单对象丰富。
:::

<FetchPartial/>
Expand Down

0 comments on commit 8c8c065

Please sign in to comment.