将 Spring 数据 JPA 与存储在 MySQL 数据库中的邻接矩阵一起使用
Using Spring Data JPA with an adjacency matrix stored in a MySQL database
我刚开始使用 Spring Data Jpa,但我知道通常会在 Java 中创建一个 'Model'/ 'Entity' class 来表示一行数据库中的数据 table。当我有一个小的 table 和 3 列/ class 属性时,这对我来说很有意义,但是 table 有 100 列的情况呢?很难创建具有 100 个属性的 'Model' class?我问这个的原因是因为我在 MySQL 数据库 table 中存储了一个大型的火车站邻接矩阵。我想在我的 Java Spring 应用程序中与这些数据进行交互,但不知道如何做到这一点。
我承认在这种情况下我可能存储数据不正确或者根本不应该使用 Spring Data JPA。任何建议将不胜感激!
谢谢。
编辑:
我会尝试更清楚地解释我要做什么。我想基本上将此 'Stations'(邻接矩阵)数据库 table 的副本导入到我的 Java Spring 应用程序中。我不知道如何最好地执行这个 'import',或者用什么 Java 数据结构来存储 table。我希望能够像 BFS 这样的 运行 算法在 Java.
中的数据上一次
table中的数据是显示火车网络图的邻接矩阵。 “1”表示车站由轨道连接,“0”表示没有连接。
如果您的模型确实由一百个属性表示,那么是的,您可以创建一个具有一百个属性的实体。但我认为您的模型需要重新设计,因为在我看来,插入新记录需要更改架构。
由于我不知道这些列代表什么,所以我假设它们可能是下一站和上一站?这将是一个简单的模型来表示这一点。
@Entity
@Table(name = "station")
@Getter
@Setter
public class Station {
@Id
private Long id;
@Column(name = "name")
private String name;
@OneToOne
@JoinColumn(name = "previous_station_id")
private Station previous;
@OneToOne
@JoinColumn(name = "next_station_id")
private Station next;
}
您的 DDL 将如下所示:
create table station
(
id bigint auto_increment,
name varchar(255) null,
previous_station_id bigint null,
next_station_id bigint null,
constraint station_id_uindex
unique (id),
constraint station_station_id_fk
foreign key (previous_station_id) references station (id),
constraint station_station_id_fk_2
foreign key (next_station_id) references station (id)
);
create index station_next_station_id_index
on station (next_station_id);
create index station_previous_station_id_index
on station (previous_station_id);
alter table station
add primary key (id);
因为这个 table 实际上有回到它自己的键,你会先插入一个没有上一个或下一个集合的站,然后你会更新记录来设置这些值。如果我不了解这些值是什么,请更新您的问题以更好地描述您尝试建模的内容以获得更准确的答案。
你可以像这样使用两个 classes :
@Entity
public class TestClass {
@Id
private long id;
@OneToMany(mappedBy="testClass")
private List<MatrixRow> matrix;
}
和一个 MatrixLine class:
@Entity
public class MatrixRow {
@Id
private long id;
@ManyToOne
private TestClass testClass;
@CollectionOfElements
private List<Value> row;
}
我想当你做 BFS 时你需要一个以前的站名,所以你要么必须创建一个模型 class 有 100 个名字并使用 @Getter 和 @Setter 注释或创建一个包含 100 个元素的列表,并将索引表示作为枚举存储在其他一些文件中,在这种情况下,您必须将数据库架构更改为站和数组 blob/text.
在这种情况下,将其表示为多对多关系可能效果很好。我对 JPA 不太熟悉,但我认为它看起来像这样:
@Getter
@Setter
@Entity
public class Station {
@Id
private Long id;
private String name;
@ManyToMany
private Set<Station> adjacentStations;
}
站点是相互连接的,这样当B站与A站相邻时(即B在A的相邻站集合中),则A站也与B站相邻(即A也在B的相邻站集合中)相邻车站)。
在数据库中,站点之间的关系将通过一个映射 table 表示,该映射具有两列(station_id_1、station_id_2),每个连接一行。
我刚开始使用 Spring Data Jpa,但我知道通常会在 Java 中创建一个 'Model'/ 'Entity' class 来表示一行数据库中的数据 table。当我有一个小的 table 和 3 列/ class 属性时,这对我来说很有意义,但是 table 有 100 列的情况呢?很难创建具有 100 个属性的 'Model' class?我问这个的原因是因为我在 MySQL 数据库 table 中存储了一个大型的火车站邻接矩阵。我想在我的 Java Spring 应用程序中与这些数据进行交互,但不知道如何做到这一点。
我承认在这种情况下我可能存储数据不正确或者根本不应该使用 Spring Data JPA。任何建议将不胜感激!
谢谢。
编辑:
我会尝试更清楚地解释我要做什么。我想基本上将此 'Stations'(邻接矩阵)数据库 table 的副本导入到我的 Java Spring 应用程序中。我不知道如何最好地执行这个 'import',或者用什么 Java 数据结构来存储 table。我希望能够像 BFS 这样的 运行 算法在 Java.
中的数据上一次table中的数据是显示火车网络图的邻接矩阵。 “1”表示车站由轨道连接,“0”表示没有连接。
如果您的模型确实由一百个属性表示,那么是的,您可以创建一个具有一百个属性的实体。但我认为您的模型需要重新设计,因为在我看来,插入新记录需要更改架构。
由于我不知道这些列代表什么,所以我假设它们可能是下一站和上一站?这将是一个简单的模型来表示这一点。
@Entity
@Table(name = "station")
@Getter
@Setter
public class Station {
@Id
private Long id;
@Column(name = "name")
private String name;
@OneToOne
@JoinColumn(name = "previous_station_id")
private Station previous;
@OneToOne
@JoinColumn(name = "next_station_id")
private Station next;
}
您的 DDL 将如下所示:
create table station
(
id bigint auto_increment,
name varchar(255) null,
previous_station_id bigint null,
next_station_id bigint null,
constraint station_id_uindex
unique (id),
constraint station_station_id_fk
foreign key (previous_station_id) references station (id),
constraint station_station_id_fk_2
foreign key (next_station_id) references station (id)
);
create index station_next_station_id_index
on station (next_station_id);
create index station_previous_station_id_index
on station (previous_station_id);
alter table station
add primary key (id);
因为这个 table 实际上有回到它自己的键,你会先插入一个没有上一个或下一个集合的站,然后你会更新记录来设置这些值。如果我不了解这些值是什么,请更新您的问题以更好地描述您尝试建模的内容以获得更准确的答案。
你可以像这样使用两个 classes :
@Entity
public class TestClass {
@Id
private long id;
@OneToMany(mappedBy="testClass")
private List<MatrixRow> matrix;
}
和一个 MatrixLine class:
@Entity
public class MatrixRow {
@Id
private long id;
@ManyToOne
private TestClass testClass;
@CollectionOfElements
private List<Value> row;
}
我想当你做 BFS 时你需要一个以前的站名,所以你要么必须创建一个模型 class 有 100 个名字并使用 @Getter 和 @Setter 注释或创建一个包含 100 个元素的列表,并将索引表示作为枚举存储在其他一些文件中,在这种情况下,您必须将数据库架构更改为站和数组 blob/text.
在这种情况下,将其表示为多对多关系可能效果很好。我对 JPA 不太熟悉,但我认为它看起来像这样:
@Getter
@Setter
@Entity
public class Station {
@Id
private Long id;
private String name;
@ManyToMany
private Set<Station> adjacentStations;
}
站点是相互连接的,这样当B站与A站相邻时(即B在A的相邻站集合中),则A站也与B站相邻(即A也在B的相邻站集合中)相邻车站)。
在数据库中,站点之间的关系将通过一个映射 table 表示,该映射具有两列(station_id_1、station_id_2),每个连接一行。