Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Spring数据JPA,邻接矩阵存储在MySQL数据库中

我不熟悉使用Spring Data Jpa,但我知道人们通常会在Java中创建一个“Model”/“Entity”类,它代表数据库表中的一行数据。当我有一个包含3列/类属性的小表时,这对我来说是有意义的,但是对于一个包含100列的表来说呢?很难创建一个具有100个属性的“模型”类?我之所以问这个问题,是因为我在MySQL数据库表中存储了一个大型的火车站邻接矩阵。我想在我的Java Spring应用程序中与这些数据交互,但我不知道该怎么做

我愿意接受这样一个事实:在这种情况下,我可能存储的数据不正确,或者根本不应该使用Spring data JPA。任何建议都将不胜感激

谢谢

Screenshot of part of my adjacency matrix table in MySQL

编辑:

我会尽量更清楚地解释我要做的事情。实际上,我想将这个“Stations”(邻接矩阵)数据库表的一个副本导入到我的Java Spring应用程序中。我不知道如何最好地执行这个“导入”,也不知道存储表的Java数据结构。我希望能够在Java中对数据运行一次类似BFS的算法

表中的数据是显示列车网络图的邻接矩阵。“1”表示站点通过轨道连接,“0”表示没有连接


共 (4) 个答案

  1. # 1 楼答案

    可以使用以下两个类:

    @Entity
    public class TestClass {    
       @Id
       private long id;
    
       @OneToMany(mappedBy="testClass")
       private List<MatrixRow> matrix; 
    }
    

    还有一个MatrixLine类:

    @Entity
    public class MatrixRow {
      @Id
      private long id;
    
      @ManyToOne
      private TestClass testClass;
    
      @CollectionOfElements
      private List<Value> row;
    }
    
  2. # 2 楼答案

    如果你的模型真的用一百个属性表示,那么是的,你可以创建一个有一百个属性的实体。但是我认为你的模型需要修改,因为我认为插入一个新记录需要改变模式

    既然我不知道这些列代表什么,我就假设它们可能是下一站和上一站?这将是一个简单的模型来表示这一点

    @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);
    

    因为这个表实际上有自己的键,所以首先要插入一个没有上一个或下一个设置的站,然后更新记录来设置这些值。如果我不知道这些值是什么,请更新你的问题,更好地描述你试图建立的模型,以获得更准确的答案

  3. # 3 楼答案

    我想当你做BFS的时候你需要一个以前的电台名称,因此,要么创建一个有100个名称的模型类,使用@Getter和@Setter注释,要么创建一个有100个元素的列表,并将索引表示形式作为枚举存储在其他一些文件中。在这种情况下,您必须将数据库模式更改为stations,并将数组作为blob/text

  4. # 4 楼答案

    在这种情况下,将其表示为多对多关系可能会很好。我对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的相邻车站集中)

    在数据库中,站点之间的关系将通过一个映射表来表示,该映射表有两列(station_id_1、station_id_2),每个连接一行