配置关系
来源:JHipster |
时间:2018-11-04
|
|

简述

只有使用JPA的时候关系才会工作,如果你选择 Cassandra, MongoDB of Couchbase的话关系是不可用的。

一个关系产生于两个实体之间,JHipster会生成如下代码:

  • 生成实体时通过JPA管理关系

  • 生成正确的Liquibase changelog,以便在已有的数据库中维护关系。

  • 生成angular的前端,你就可以通过图形使用用户接口管理关系。

JHipster UML 以及 JDL studio

这个章描述了如何通过Jhipster标准命令行接口生成关系。如果你需要常见比较多的实体和关系的时候,更好使用一些图形工具。

  • JHipster UML: 允许使用UML编辑器

  • JDL Studio:在线工具,使用我们特定的语言创建实体和关系

你可以通过import-jdl子生成器使用JDL文件生成实体和关系jhipster import-jdl you-jdl-file.jh

可用的关系

我们使用JPA,通常可用的关系有:one-to-many,many-to-one,many-to-many,以及one-to-one:

  1. 双向一对多

  2. 单向多对一

  3. 单向一对多

  4. 同一实体上的两个多对一关系

  5. 多对多关系

  6. 一对一关系

  7. 单向一对一关系

请注意通过jhipster生成的User实体,你可以:

  • 给此实体添加many-to-one关系(一个Carmany-to-oneUser),这将会在你的新的实体Repository中生成一个特定的查询,然后你参考一使用当前的认证用户查询实体。在生成的angular界面,你可以通过下拉选择Car来选中一个用户。

  • many-to-manyone-to-one关系在User实体中,另一个实体必须是关系的所有者(一个TeamUser是many-to-many关系,但是Team能增删User,但是User不能增删Team).在angular界面,你可以在多选框中选择User.

单向一对多关系

让我们从两个实体开始吧,OwnerCar。一个owner可以多辆car,一个car只能属于一个owner。

因此在owner这边是一个简单的一对多关系,而在另一边是一个多对一的关系。

Owner (1) <------> (*) Car

首先我们来创建Owner,这有几个关系Owner的问题:

jhipster entity Owner
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Car
? What is the name of the relationship? car
? What is the type of the relationship? one-to-many
? What is the name of this relationship in the other entity? owner123456789

请注意我们选择默认的关系名称。接下来,我们生成Car:

jhipster entity Car
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Owner
? What is the name of the relationship? owner
? What is the type of the relationship? many-to-one
? When you display this relationship with AngularJS, which field from 'Owner' do you want to use? id12345678

使用下边的JDL也可以实现:

entity Owner
entity Car

relationship OneToMany {
  Owner{car} to Car{owner}}1234567

这样,你现在就拥有了一个一对多的关系在两个实体之间。在angular界面你可以通过Car下拉框选中一个User.

单向对多一关系

在前边的例子中我们有一个双向关系:通过Car实例可以发现他的Owner,通过Owner可以找到他的所有Car

一个单向多对一的关系意味着Car可以知道他们的Owner,但是不能反过来:

Owner (1) <------ (*) Car

拥有这样的关系可能有两个原因:

  • 从业务的角度来讲,你仅需要通过这种方式使用实体,因此不希望有其他的API允许开发者做一些没有意义的事情

  • 期望使用Owner时性能提升(因为你不用哪个维护一个Car的集合)

在这个例子中,你仍然需要先创建Owner,但这次没有生成关系:

jhipster entity Owner...Generating relationships with other entities
? Do you want to add a relationship to another entity? No12345

接下来生成Car实体,和前边的例子相似:

jhipster entity Car
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Owner
? What is the name of the relationship? owner
? What is the type of the relationship? many-to-one
? When you display this relationship with AngularJS, which field from 'Owner' do you want to use? id123456789

这将会和前边的例子一样正常公国,但是我们不能通过Owner来添加和删除Car。在angular你将会通过Car的下来框选中一个Owner。下边是相关的JDL:

entity Owner
entity Car

relationship ManyToOne {
  Car{owner} to Owner
}123456

单向一对多关系

单向一对多关系意味着Owner实例可以获取一个Car集合,但不反过来不能。这个和前边的例子是相反的:

Owner (1) ------> (*) Car

目前,这种关系类型Jhipster默认是不提供的。原因查看#1569

你有两种解决方式:

  • 使用一个双向映射不用修改,这也是我们推荐的,相对比较简单

  • 使用一个双向映射,然后将西修改成单向映射: 

    • @OneToMany注解上移除mappedBy属性

    • 生成所需要的表:你可以使用mvn liquibase:diff生成表。

在JHipster中不支持通过JDL生成这种关系。

同一实体的一对多关系

在这个例子中,一个Person可以成为多个Car的拥有者,当然他也可以驾驶多辆Car:

Persion (1) <---owns---> (*) Car
Persion (1) <---drivers---> (*) Car12

为此我们需要使用我们之前的例子中保留的默认关系名称。

生成Persion实体,它具有到Car的一对多关系:

jhipster entity Person
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Car
? What is the name of the relationship? ownedCar
? What is the type of the relationship? one-to-many
? What is the name of this relationship in the other entity? owner
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Car
? What is the name of the relationship? drivedCar
? What is the type of the relationship? one-to-many
? What is the name of this relationship in the other entity? driver12345678910111213141516

生成Car实体,使用在Person中的相同的关系名称:

jhipster entity Car
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Person
? What is the name of the relationship? owner
? What is the type of the relationship? many-to-one
? When you display this relationship with AngularJS, which field from 'Person' do you want to use? id...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Person
? What is the name of the relationship? driver
? What is the type of the relationship? many-to-one
? When you display this relationship with AngularJS, which field from 'Person' do you want to use? id12345678910111213141516

也可以通过如下的JDL实现:

entity Person
entity Car

relationship OneToMany {
  Person{ownedCar} to Car{owner}}

relationship OneToMany {
  Person{drivedCar} to Car{driver}}12345678910

现在,一个Car拥有一个driver和一个owner,他们都是Person实体。在生产的angular的界面我们可以下拉Carownerdriver选中一个Person.

多对多关系

一个Driver可以驾驶多辆汽车,但是一辆Car也可以有被多个司机。

Driver (*) <------> (*) Car

在数据库级别,这意味着DriverCar会有一张关联表。

对于JPA,这两个实体中一个将负责管理关系:在我们的例子中,将有Car来负责增删Driver.

让我们在没有关系所有权的一方生成多对多关系:

jhipster entity Driver
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Car
? What is the name of the relationship? car
? What is the type of the relationship? many-to-many
? Is this entity the owner of the relationship? No
? What is the name of this relationship in the other entity? driver123456789

接下来生成具有多对多关系所有权的一方Car:

jhipster entity Car
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Driver
? What is the name of the relationship? driver
? What is the type of the relationship? many-to-many
? Is this entity the owner of the relationship? Yes
? When you display this relationship with AngularJS, which field from 'Driver' do you want to use? id12345678910

也可以通过JDL实现相同的目的:

entity Driver
entity Car

relationship ManyToMany {
  Car{driver} to Driver{car}}1234567

这样,你就拥有了两个实体之间的多对多关系。在生成的angular界面,你可以通过一个Car的复选下拉框来选择属于这个Car的多个Driver了。

一对一关系

接着我们之前的例子,一个一对一关系意味着一个Driver只能驾驶一辆Car,一辆Car只能有一个Driver

Driver (1) <------> (1) Car

首先我们创建没有关系所有权的一方,Driver:

jhipster entity Driver
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Car
? What is the name of the relationship? car
? What is the type of the relationship? one-to-one
? Is this entity the owner of the relationship? No
? What is the name of this relationship in the other entity? driver123456789

接下来我们创建拥有关系所有权的一方Car:

jhipster entity Car
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Driver
? What is the name of the relationship? driver
? What is the type of the relationship? one-to-one
? Is this entity the owner of the relationship? Yes
? What is the name of this relationship in the other entity? car
? When you display this relationship with AngularJS, which field from 'Driver' do you want to use? id12345678910

通过JDL可以实现相同的目的:

entity Driver
entity Car

relationship OneToOne {
  Car{driver} to Driver{car}}123456

单向一对一关系

单向一对一关系意味着可以通过citizen获取到passport,但不能通过passport获取citizen

Citizen (1) -----> (1) Passport

首先我们生成没有任何所属关系的一方Passport:

jhipster entity Passport...Generating relationships with other entities
? Do you want to add a relationship to another entity? No1234

接下来,生成Citizen实体:

jhipster entity Citizen
...
Generating relationships with other entities
? Do you want to add a relationship to another entity? Yes
? What is the name of the other entity? Passport
? What is the name of the relationship? passport
? What is the type of the relationship? one-to-one
? Is this entity the owner of the relationship? Yes
? What is the name of this relationship in the other entity? citizen
? When you display this relationship with AngularJS, which field from 'Passport' do you want to use? id12345678910

做完这些,一个Citizen拥有一个护照,但是在Passport上没有定义Citizen实例。生产的angular界面上,你可以下拉Citizen来选中一个Passport

相应的JDL如下:

entity Citizen
entity Passport

relationship OneToOne {
  Citizen{passport} to Passport
}


提交
查看更多评论
没有更多评论